天天看点

Redis总结(二)缓存穿透、缓存击穿、缓存雪崩

本篇文章主要介绍redis的缓存穿透、缓存击穿及缓存雪崩造成的原因及解决方案

一、缓存穿透

概念:是指查询一个数据库一定不存在的数据

解释:客户端请求数据,redis中没有,则去数据库查询发现也没有,如果在用户量大或者有人恶意请求则会一直穿过缓存去请求数据库,对数据库造成很大的压力。

解决方式:

  1. 在接口层根据业务增加一些用户鉴权校验,非法参数请求校验,降低数据库压力,比如id小于0之类的
  2. 设置空值缓存,在缓存中取不到数据,并且在数据库中也取不到数据,也可以将key-value对写为key-null,但是需要设置一定合理的缓存过期时间,防止正常情况无法使用
  3. 设置布隆过滤器,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。

二、缓存击穿

概念:对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据

解释:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方式:

  1. 设置热点数据永远不过期。
  2. 加互斥锁,如果缓存中有数据则查询到直接返回,如果换成中不存在数据则加锁让获取锁的这个线程去读取数据,然后后续线程还是读取缓存。比如redis的setNx
  3. "提前"使用互斥锁,在读取时对比缓存时间如果快到了则进行加锁,更新时间及重新从数据库拉去数据。

三、缓存雪崩

概念:指缓存大量失效,导致大量的请求都直接向数据库获取数据,造成数据库的压力

解释:缓存雪崩造成的原因可能是因为我们在设置缓存时大量缓存的过期时间设置的一致或缓存服务器宕机,导致同时过期,大量请求直接奔向数据库

解决方式:

  1. 加锁,减低数据库压力,但是这样的效率比较低
  2. 在设置redis过期时间时加上一个随机数,避免大批数据过期场景
  3. 部署分布式redis,在一台redis服务器故障时,立刻将请求转移到另一台

继续阅读