深入了解Redis【十九】缓存并发之key竞争与缓存穿透、击穿、雪崩问题
引言
简单的使用redis的缓存功能是比较容易的,比如计数或者存储个配置信息,但是当并发数上来的时候,就会出现一些列的问题,
比如题目中出现的key竞争,缓存穿透、缓存击穿、缓存雪崩,下面分别描述一下,并简答的给出解决方案。
1、key并发竞争
1.1、问题描述
当多个系统去set同一个key时,可能本来应该先到的值,后到了,导致了数据版本不一致;
又或者是多个系统去同时获取一个key,修改值之后再写回redis,只要顺序错了,数据就错了。
1.2、解决办法
可以使用时间戳作为版本号,但是这种情况也会有个别机器系统时间回调,时间不确定的问题,也可以使用队列,将并行改为串行。
2、缓存穿透
2.1、问题描述
大量不存在的key查询,越过缓存,查询数据库,一些恶意攻击等造成大量未命中(缓存和数据库均未命中)。
2.2、解决办法
在缓存层之前增加一道过滤屏障,存储所有数据库中目前存在的所有key。可以采用布隆过滤器,虽说会有误报的问题,但也能有很大作用。
3、缓存击穿
3.1、问题描述
高并发情况下,某一个key失效(缓存时间过期),造成大量的数据库查询操作。
3.2、解决办法
热点key永久缓存(不设置缓存过期时间);使用互斥锁也可以解决这个问题。
4、缓存雪崩
4.1、问题描述
高并发情况下,缓存中的大量key同时失效,比如电商中的双十一活动,
在开始前所有商品都设置一样的过期时间,假设1小时,时间过去之后,所有缓存失效,请求都落到数据库上。
4.2、解决办法
将数据分类,区分冷热数据,设置不同的缓存失效时间;
同一分类数据下,缓存时间设置成对随机性,分散缓存的过期时间。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!