缓存穿透、缓存击穿和缓存雪崩详解

一、缓存穿透

指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会被打到数据库上,当用户很多时,缓存都没有命中就会给数据库造成很大压力。

解决方案:

(1)布隆过滤器(对可能查询的数据先用hash存储),不存在真的不存在,存在不一定存在,并非百分百准确,有一定的穿透风险。内存占用较少,但是实现复杂,存在误判可能

(2)缓存空对象:缓存一个空对象在Redis中,优点是实现简单,维护方便,缺点是额外的内存消耗,因为缓存了一些瞎编的id对应的空对象,但是可以通过给对象设置TTL解决,也可能造成短期的数据不一致,如果此时真的存入了一个瞎编的id对应的对象,那么此时Redis中就缓存了一个空对象,此时用户去查询数据,明明数据库已经有了对应的对象,但是用户得到的依然是一个空对象,这个也可以通过将TTL设置的时间短一些来解决。最长不超过五分钟。

二、缓存击穿

指在同一个时间内访问一个请求的请求数过多,而在这个时候缓存某个key失效了,这个时候就会冲向数据库造成缓存击穿。当缓存的热点key过期后,一个线程来请求数据,查询缓存未命中,然后从数据库中查询然后重新构建缓存数据(需要一定的时间),在缓存数据还没构建完成此时又有大量请求进来去查询数据,缓存中未命中数据,于是后面进来的请求也同步之前请求从数据库中查询数据并构建缓存的这一过程,此时这些请求全部打到数据库中,导致数据库压力变大。

解决方案:

(1)设置缓存永远不过期

(2)加互斥锁,使用分布式锁,保证每个key只有一个线程去查询后端服务,而其他线程为等待状态。这种模式将压力转到了分布式锁上

缓存穿透、缓存击穿和缓存雪崩详解_第1张图片

三、缓存雪崩

当某⼀时刻发⽣⼤规模的缓存失效的情况,例如缓存服务宕机、大量key在同一时间过期,这样的后果就是⼤量的请求进来直接打到DB上,可能导致整个系统的崩溃,称为雪崩。如果运维重启宕机的数据库,马上又会有大量新的请求流量到来,再次引起数据库宕机。

解决方案:

(1)与时点性无关时,给不同的key的TTL设置随机值;与时点性有关,如0点需换新的key,则强依赖使用缓存击穿的第二个解决方案

(2)利用Redis集群提高服务的可用性

(3) 给缓存业务添加限流降级的策略

(4)给业务添加多级缓存

(5)提高数据后台数据库的容灾能力

你可能感兴趣的:(Redis,redis)