编程技术分享平台

网站首页 > 技术教程 正文

Redis的缓存雪崩、穿透、击穿问题

xnh888 2024-10-16 17:32:45 技术教程 22 ℃ 0 评论

快速了解

1、什么是缓存雪崩现象,是怎么导致的,如何解决

2、什么是缓存穿透现象,是怎么导致的,如何解决

3、什么是缓存击穿现象,是怎么导致的,如何解决

4、缓存穿透和缓存击穿的区别

背景:

只要是在系统中引入了中间件缓存模块,就均有可能出现缓存面临的这些问题:缓存雪崩、穿透、击穿问题。认识这些问题背后产生的本质,以后在涉及到利用缓存业务的时候,尤其是并发高的时候,特别需要注意这些问题

缓存雪崩

缓存雪崩是指缓存中大量的数据同一时刻失效或者缓存不可用,而查询数据量巨大,直接打到数据库,引起数据库压力过大甚至宕机的现象。

导致的可能原因:

  1. key设置过期的时间一致
  2. redis不是高可用,挂掉了。

解决方案:

  1. 批量往Redis存数据的时候,把每个Key的失效时间都加个随机值
  2. 搭建高可用的redis,比如哨兵模式或者集群模式
  3. 兜底逻辑使用熔断机制。防止过多请求同时打到DB


缓存击穿

缓存击穿指并发查同一条数据,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。

缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  1. 热点key缓存不失效:对热点key可以设置永不过期。
  2. 使用互斥锁或堵塞队列:这样可以控制数据库的线程访问数,减小数据库的压力,但也会让系统吞吐率有所下降



缓存穿透

指查询一个数据库一定不存在的数据【绕过缓存去查数据库。(尤其是黑客攻击)】

原因:

  • 黑客攻击,空数据查询通常指攻击者伪造大量不存在的数据进行访问(比如不存在的商品信息、用户信息)
  • 网络爬虫,缓存污染通常指在遍历数据等情况下冷数据把热数据驱逐出内存,导致缓存了大量冷数据而热数据被驱逐。

解决:

  • 添加一些校验。接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。
  • 网关层Nginx配置IP或者代码逻辑实现限制ip同一时间段的访问次数
  • 利用布隆过滤器来实现对缓存 key 的检验

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表