美文网首页程序员
缓存系统的常见问题及处理方式

缓存系统的常见问题及处理方式

作者: 数齐 | 来源:发表于2017-02-17 11:07 被阅读95次

    缓存技术是我们日常开发过程中常用的优化技术,针对静态资源和非热数据可以放入缓存,请求发生时先到缓存中获取,没有则到数据库加载,放入缓存中以备下次缓存生效。但是实际运用中,在高并发环境下有可能出现各种问题。

    • 缓存穿透
      当我们查询一个一定不存在的数据。首先数据库没有值我们一般是不写入缓存中的。这将导致查这类数据,缓存没有意义,直接查库,而且会造成性能的损耗(都查了一次缓存)。
      可能导致的问题:遇到攻击,直接打到数据库层,增大DB压力置其不可用。
      解决方案:对于数据库中国不存在的数据,也往缓存中设置值,但是这个值是无效值,例如“NULL”字符串,应用层处理时,碰到这个标识,就认为是无效数据,但它的过期时间会很短。
    • 缓存失效
      如果应用系统中设置了多个缓存且失效时间一致,当到达缓存超时时间,缓存同时失效,请求全部到达DB,造成雪崩。
      可能导致的问题:DB压力过重宕掉。
      解决方案:将缓存超时时间分散开。
    • 缓存并发
      针对同一个缓存如果过期,在并发大的环境下,多个请求查询缓存无忧数据后,请求会大量到达DB。
      可能导致的问题:DB压力过重宕掉,缓存频繁更新。
      解决方案:首先先查缓存,缓存中不存在的话,使用重入锁或着同步锁(synchronized),锁住,然后只有一个线程可以获得锁之后开始查库,数据如缓存。其他线程阻塞,负责写的线程释放锁后,其他线程获得执行权,再一次从缓存中取,然后返回。这样保证了只写入一次,也保证了只查一次库。

    相关文章

      网友评论

        本文标题:缓存系统的常见问题及处理方式

        本文链接:https://www.haomeiwen.com/subject/kdpkwttx.html