redis 常见缓存问题,因为缓存雪崩和穿透,要么不出现,要么出现就致命问题,所以这也是常见面试题。
缓存穿透
什么是缓存穿透:
在一个系统中,突然有几千个请求同时进来,缓存中查询不到,数据库也查询不到。这种恶意请求可能一下子就把数据库给打死了。(就好像没有缓存一般)。
解决方案
将查询出来的空值也存入redis当中,设置一个过期时间,在该时间段无论多少次请求都不会进入数据库。
缓存击穿
什么是缓存击穿
有一个热点数据,当前访问量非常大,突然热点数据失效了,同时几千个请求访问数据库,一瞬间数据库死掉。(缓存突然开了一个洞,请求全进去了)
解决方案
不同的场景下解决方案不同:
- 缓存的数据用不更新,可以设置为永不过期
- 缓存数据更新不频繁,可以采用互斥锁(redis的SETNX等),使其少量请求进入访问,其他的请求等进入的请求写入缓存后,直接访问缓存
- 缓存频繁更新,可以利用定时任务在缓存过期前主动更新一下,或延迟过期时间,保证请求能一直找到对应的请求。
缓存雪崩
什么是缓存雪崩
当某一时刻,大量的缓存同时失效,或者缓存宕机了,随后所有的请求进入数据库,数据库扛不住死掉了。
解决方案
- 事前:使用集群,高可用,主从+哨兵
- 事中:ehcache+Hystrix限流&降级,避免MySQL被打死
- 事后:服务器一重启马上恢复持久化数据
- 其他方法:给这些数据设置不同的过期时间,不至于一瞬间请求全部涌入数据库。
总结
以上就是redis缓存的常见问题,以及解决方案。
其实上面的问题都在解决一个问题。避免请求一下子的把数据库给弄死。
当然项目中需要根据自己的实际架构和业务情况进行选择解决。