缓存雪崩
缓存雪崩是指设置缓存时采用了相同的过期时间,导致缓存在某一个时刻同时失效,或者缓存服务器宕机宕机导致缓存全面失效,请求全部转发到了DB层面,DB由于瞬间压力增大而导致崩溃。缓存失效导致的雪崩效应对底层系统的冲击是很大的。
解决方式
\1. 对缓存的访问,如果发现从缓存中取不到值,那么通过对这个key请求加锁或者队列的方式保证缓存的单进程操作,从而避免失效时并发请求全部落到底层的存储系统上;但是这种方式会带来性能上的损耗。
\2. 将缓存失效的时间分散,降低每一个缓存过期时间的重复率
\3. 如果是因为缓存服务器故障导致的问题,一方面需要保证缓存服务器的高可用、另一方面,应用程序中可以采用多级缓存
缓存穿透
缓存穿透是指查询一个根本不存在的数据,缓存和数据库都不会命中。一般情况下,如果从数据层查不到数据
则不写入缓存,即数据库返回值为 null 时,不缓存 null到redis中。缓存穿透问题可能会使后端数据库负载加大,由于很多后端数据库不具备高并发性,甚至可能造成后端数据库宕掉
解决方式
\1. 如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。比如,设置这个key的value= “&&”,并且过期时间设置短一点,比如不超过五分钟。
在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以放弃掉这次操作,过段时间,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。
\2. 根据缓存数据Key的设计规则,将不符合规则的key进行过滤采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。
缓存击穿
热点key在某一时间过期了,大量请求进来访问
解决方式
1.设置热点key不过期
2.使用互斥锁,只有一个请求查询数据库,查到后更新缓存,其他请求唤醒后直接就查询缓存了