缓存雪崩
缓存雪崩
,由于缓存中有大量数据同时过期失效或者缓存出现宕机,大量的应用请求无法在 Redis 缓存中进行处理,进而发送到数据库层导致数据库层的压力激增,严重的会造成数据库宕机。
对于缓存中有大量数据同时过期,导致大量请求无法得到处理。
解决方式:
-
数据预热
,将发生大并发访问前手动触发加载缓存不同的key, 可以避免在用户请求的时候,先查询数据库 -
设置不同的过期时间
,让缓存失效的时间点尽量均匀 -
双层缓存策略
, 在原始缓存上加上拷贝缓存,原始缓存失效时可以访问拷贝缓存,且原始缓存失效时间设置为短期,拷贝缓存设置为长期 -
服务降级
对于缓存出现宕机,解决方式:
业务系统中 实现服务熔断
或请 求限流机制
,防止大量访问导致数据库出现宕机
缓存穿透
缓存穿透
,数据在数据库和缓存中都不存在,这样就导致查询数据,在缓存中找不到对应key的value,都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。
当有大量访问请求,且其绕过缓存直接查数据库,导致数据库层的压力激增,严重的会造成数据库宕机。
对于缓存穿透,解决方式:
-
缓存空值或缺省值
,当一个查询返回的数据为空时, 空结果也将进行缓存,并将它的过期时间设置比较短,下次访问直接从缓存中取值,避免了把大量请求发送给数据库处理,造成数据库出问题。 -
布隆过滤器( BloomFilter ),将所有可能查询数据key哈希到一个足够大的bitmap中
, 在查询的时候先去BloomFilter去查询key是否存在,如果不存在就直接返回,存在再去查询缓存,缓存中没有再去查询数据库 ,从而避免了数据库层的压力激增出现宕机。
缓存击穿
缓存击穿
,针对某个访问非常频繁的热点数据过期失效,导致访问无法在缓存中进行处理,进而会有导致大量的直接请求数据库,从而使得数据库层的压力激增,严重的会造成数据库宕机。
对于缓存击穿,解决方式:
不设置过期时间,对于访问特别频繁的热点数据,不设置过期时间
。
总结
在大多数业务场景下,Redis缓存作为只读缓存使用。针对只读缓存来说, 优先使用先更新数据库再删除缓存的方法保证数据一致性 。
其中,缓存雪崩,缓存穿透,缓存击穿三大问题的原因和解决方式:
问题 | 原因 | 解决方式 |
缓存雪崩 | 大量数据同时过期失效缓存出现宕机 | 数据预热 设置不同的过期时间 双层缓存策略 服务降级 服务熔断 限流机制 |
缓存穿透 | 数据在数据库和缓存中都不存在 | 缓存空值或缺省值 布隆过滤器( BloomFilter ) |
缓存击穿 | 访问非常频繁的热点数据过期失效 | 对于访问特别频繁的热点数据,不设置过期时间 |