缓存雪崩

缓存雪崩,由于缓存中有大量数据同时过期失效或者缓存出现宕机,大量的应用请求无法在 Redis 缓存中进行处理,进而发送到数据库层导致数据库层的压力激增,严重的会造成数据库宕机。
对于缓存中有大量数据同时过期,导致大量请求无法得到处理。

解决方式:

  1. 数据预热,将发生大并发访问前手动触发加载缓存不同的key, 可以避免在用户请求的时候,先查询数据库
  2. 设置不同的过期时间,让缓存失效的时间点尽量均匀
  3. 双层缓存策略, 在原始缓存上加上拷贝缓存,原始缓存失效时可以访问拷贝缓存,且原始缓存失效时间设置为短期,拷贝缓存设置为长期
  4. 服务降级

对于缓存出现宕机,解决方式:
业务系统中 实现服务熔断 或请 求限流机制 ,防止大量访问导致数据库出现宕机

缓存穿透

缓存穿透,数据在数据库和缓存中都不存在,这样就导致查询数据,在缓存中找不到对应key的value,都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。
当有大量访问请求,且其绕过缓存直接查数据库,导致数据库层的压力激增,严重的会造成数据库宕机。

对于缓存穿透,解决方式:

  1. 缓存空值或缺省值,当一个查询返回的数据为空时, 空结果也将进行缓存,并将它的过期时间设置比较短,下次访问直接从缓存中取值,避免了把大量请求发送给数据库处理,造成数据库出问题。
  2. 布隆过滤器( BloomFilter ),将所有可能查询数据key哈希到一个足够大的bitmap中 , 在查询的时候先去BloomFilter去查询key是否存在,如果不存在就直接返回,存在再去查询缓存,缓存中没有再去查询数据库 ,从而避免了数据库层的压力激增出现宕机。

缓存击穿

缓存击穿,针对某个访问非常频繁的热点数据过期失效,导致访问无法在缓存中进行处理,进而会有导致大量的直接请求数据库,从而使得数据库层的压力激增,严重的会造成数据库宕机。

对于缓存击穿,解决方式:
不设置过期时间,对于访问特别频繁的热点数据,不设置过期时间

总结

在大多数业务场景下,Redis缓存作为只读缓存使用。针对只读缓存来说, 优先使用先更新数据库再删除缓存的方法保证数据一致性 。

其中,缓存雪崩,缓存穿透,缓存击穿三大问题的原因和解决方式:

问题

原因

解决方式

缓存雪崩

大量数据同时过期失效缓存出现宕机

数据预热

设置不同的过期时间

双层缓存策略

服务降级

服务熔断

限流机制

缓存穿透

数据在数据库和缓存中都不存在

缓存空值或缺省值

布隆过滤器( BloomFilter )

缓存击穿

访问非常频繁的热点数据过期失效

对于访问特别频繁的热点数据,不设置过期时间