引言

简单的使用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、解决办法

将数据分类,区分冷热数据,设置不同的缓存失效时间;
同一分类数据下,缓存时间设置成对随机性,分散缓存的过期时间。

tencent.jpg