Redis缓存雪崩、穿透、击穿

Redis缓存雪崩、穿透、击穿

  • 解决方案
  • 正常的缓存流程
  • Redis缓存雪崩
    • Redis缓存雪崩解决方案
  • Redis缓存穿透
    • Redis缓存穿透解决方案
  • Redis缓存击穿
    • Redis缓存击穿解决方案

解决方案

布隆过滤器,分布式锁

正常的缓存流程

Redis缓存雪崩、穿透、击穿_第1张图片

Redis缓存雪崩

Redis缓存雪崩、穿透、击穿_第2张图片
Redis中的key大面积失效,导致软件直接和数据库进行沟通,把请求都打到了数据库上。
这就是缓存雪崩,大量的redis在同一时间失效。

Redis缓存雪崩解决方案

  1. 设置缓存的失效时间,让它不要在同一时间失效。
  2. 在我们设置这个缓存的时候,随机初始化它的失效时间,这样的话就不会让所有缓存在同一时间失效,把所有请求都打到数据库上。
  3. redis一般都是集群部署,我们将热点的key放到不同的节点上去。让热点的缓存平均分布在不同的redis节点上。
  4. 不设置缓存失效的时间。
  5. 跑定时任务,定时刷缓存,例如缓存设置了三小时时效,在时效之前,把redis缓存给他重新跑进去,然后再设置三小时,不断地用这个定时任务去刷新这个缓存,这个缓存就不会失效。

Redis缓存穿透

数据库的主键就是从0开始递增的,没有负数。黑客不断利用id小于零的这个参数发请求。redis中查不到便会不断地将这个请求打到数据库上。

redis直接被这种数据穿透了,恶意用户去请求软件,然后用这个id等于负一的数据去请求。redis和数据库都没有这样的数据,一般出现这种情况都不是正常的用户,而是一些恶意的用户。

Redis缓存穿透解决方案

  1. 这个请求穿透redis到这个数据库,数据库无论查出什么请求,空或者有值都会缓存到redis中去。这样下次用同一个参数来发请求的时候,就不会穿透这个redis。但是他可能会换不同的参数。
  2. 拉黑IP,但是对方也可能更换不同的IP。
  3. 对参数的合法性检验,再判断这个参数不合法的时候,直接return掉。
  4. 使用布隆过滤器。

Redis缓存击穿

大量的用户请求去不断地访问这个热点的key,当这个热点的key突然失效,把请求打到数据库上,这个过程就叫做击穿。他是击穿一个非常热点的key。

Redis缓存击穿解决方案

  1. 让这个缓存永远不过期。
  2. 使用分布式锁。如果是单体应用的话,就可以使用互斥锁。

请求数据库这一步上锁,只有拿到锁的线程可以操作这个数据库。这个时候对数据库的压力就非常小。当他查询到这个数据之后再将缓存重新写到redis里面去。其他没有抢到锁的数据让他先睡几毫秒,然后再重新去redis里面去查询数据。

参考资料:什么是Redis缓存雪崩、穿透、击穿,十分钟给你讲的明明白白

你可能感兴趣的:(Redis,缓存,redis,数据库)