一、穿透
查询的key不在redis中,请求就会打到数据库。低频穿透不要紧,要防止高频穿透。
解决方案一:短暂缓存空对象
只能保证db和redis弱一致性
如果缓存大量空对象,会占用大量内存;同时redis有LRU/LFU内存淘汰策略,会将有价值的数据淘汰
- 解决方案二:Bloom Filter
- bloom filter认为这条数据存在,不一定存在于redis中;但bloom filter认为这条数据不存在于redis中,则一定不存在于redis中
二、穿透
“穿透”是“击穿”的特殊表现形式,热点key被击穿;比如微博的热点事件导致微博瘫痪
解决方案一:热点key不过期
- 可能导致db和redis不一致
- 解决方案二:分布式锁
- 热点key在redis查不到,只允许一个request打到db
三、雪崩
“雪崩”是“穿透”的特殊表现形式,多个热点key失效
原因:
过期时间比较一致,某个时间同时失效,可以将失效时间设为随机数
redis挂了,可以使用集群
- 解决方案一:数据预热,缓存时间随机
- 项目启动时将db的数据同步到redis,并设置随机值为过期时间
- 解决方案二:redis集群
Top comments (0)