缓存雪崩

通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。那么,当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

解决方案:
对于大量数据同一时间过期。均匀设置过期时间。
2、当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到 Redis 里),当缓存构建完成后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。
实现互斥锁的时候,最好设置超时时间,不然第一个请求拿到了锁,然后这个请求发生了某种意外而一直阻塞,一直不释放锁,这时其他请求也一直拿不到锁,整个系统就会出现无响应的现象。
3.双 key 策略
我们对缓存数据可以使用两个 key,一个是主 key,会设置过期时间,一个是备 key,不会设置过期,它们只是 key 不一样,但是 value 值是一样的,相当于给缓存数据做了个副本。
当业务线程访问不到「主 key 」的缓存数据时,就直接返回「备 key 」的缓存数据,然后在更新缓存的时候,同时更新「主 key 」和「备 key 」的数据。这种其实是用空间换时间。

针对 Redis 故障宕机而引发的缓存雪崩问题,常见的应对方法有下面这几种:
服务熔断或请求限流机制
因为 Redis 故障宕机而导致缓存雪崩问题时,我们可以启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,不用再继续访问数据库,从而降低对数据库的访问压力,保证数据库系统的正常运行,然后等到 Redis 恢复正常后,再允许业务应用访问缓存服务。
为了减少对业务的影响,我们可以启用请求限流机制,只将少部分请求发送到数据库进行处理,再多的请求就在入口直接拒绝服务,等到 Redis 恢复正常并把缓存预热完后,再解除请求限流的机制。

构建 Redis 缓存高可靠集群
服务熔断或请求限流机制是缓存雪崩发生后的应对方案,我们最好通过主从节点的方式构建 Redis 缓存高可靠集群。
如果 Redis 缓存的主节点故障宕机,从节点可以切换成为主节点,继续提供缓存服务,避免了由于 Redis 故障宕机而导致的缓存雪崩问题。

缓存击穿
我们的业务通常会有几个数据会被频繁地访问,比如秒杀活动,这类被频地访问的数据被称为热点数据。
如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。你可以认为缓存击穿是缓存雪崩的一个子集。
解决方案也是互斥锁或者不给热点数据设置过期时间,后台线程来更新缓存。

缓存穿透
当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。
缓存穿透的发生一般有这两种情况:
业务误操作,缓存中的数据和数据库中的数据都被误删除了,所以导致缓存和数据库中都没有数据;
黑客恶意攻击,故意大量访问某些读取不存在数据的业务

解决方案:
第一种方案,非法请求的限制
当有大量恶意请求访问不存在的数据的时候,也会发生缓存穿透,因此在 API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。
第二种方案,缓存空值或者默认值
当我们线上业务发现缓存穿透的现象时,可以针对查询的数据,在缓存中设置一个空值或者默认值,这样后续请求就可以从缓存中读取到空值或者默认值,返回给应用,而不会继续查询数据库。
第三种方案,使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在。
我们可以在写入数据库数据时,使用布隆过滤器做个标记,然后在用户请求到来时,业务线程确认缓存失效后,可以通过查询布隆过滤器快速判断数据是否存在,如果不存在,就不用通过查询数据库来判断数据是否存在。
即使发生了缓存穿透,大量请求只会查询 Redis 和布隆过滤器,而不会查询数据库,保证了数据库能正常运行,Redis 自身也是支持布隆过滤器的。

布隆过滤器就是一个长度为N的位图数组初始化为0,然后几个哈希函数,哈希函数取模N,该位置就是1.布隆过滤器由于是基于哈希函数实现查找的,高效查找的同时存在哈希冲突的可能性,比如数据 x 和数据 y 可能都落在第 1、4、6 位置,而事实上,可能数据库中并不存在数据 y,存在误判的情况。查询布隆过滤器说数据存在,并不一定证明数据库中存在这个数据,但是查询到数据不存在,数据库中一定就不存在这个数据。

缓存雪崩、击穿和穿透相关推荐

  1. 如何应对redis缓存的击穿、穿透和雪崩

    一.缓存击穿问题 对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常"热点"的数据.这个时候,需要考虑一个问题:缓存被"击穿&q ...

  2. 缓存雪崩 击穿 穿透

    缓存穿透 **缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意 ...

  3. 顶级“Redis学习笔记”,缓存雪崩+击穿+穿透+集群+分布式锁,NB了

    如果你是一位后端工程师,面试时八成会被问到 Redis,特别是那些大型互联网公司,不仅要求面试者能简单使用 Redis,还要深入理解其底层实现原理,具备解决常见问题的能力.可以说,熟练使用 Redis ...

  4. 缓存击穿、缓存穿透、缓存雪崩

    文章目录 多级缓存架构 缓存击穿 缓存穿透 缓存雪崩 多级缓存架构 在项目架构中,前端发送请求,服务器会先从缓存中获取数据,如果找到数据则直接返回,如果在缓存中没有找到则会去从数据库中获取,数据库取到 ...

  5. Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

    欢迎关注方志朋的博客,回复"666"获面试宝典 原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上 ...

  6. 烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?

    前言 对于从事后端开发的同学来说,缓存已经变成的项目中必不可少的技术之一. 没错,缓存能给我们系统显著的提升性能.但如果你使用不好,或者缺乏相关经验,它也会带来很多意想不到的问题. 今天我们一起聊聊如 ...

  7. 《如何与面试官处朋友》系列-缓存击穿、穿透、雪崩场景原理大调解

    前面我们提到分布式多级缓存架构的全貌,但总感觉少了些什么东西.在这样大的场景下面,如果遇到缓存使用问题那可咋办?但自古英雄出少年,相信此刻你已踏马西去,正走在寻找答案上得夕阳西下.每每面谈Redis大 ...

  8. 明白了缓存穿透和缓存雪崩,再了解一下缓存击穿!

    作者 l 会点代码的大叔(CodeDaShu) 在往期文章中,我们介绍了缓存穿透和缓存雪崩,其中缓存雪崩,是对于一些设置了过期时间的 key,在某个时间点集体失效后,有大量的请求落到数据库上导致被击垮 ...

  9. 缓存雪崩缓存击穿缓存穿透的本质

    缓存雪崩 什么是缓存雪崩? 大量请求无法在缓存中命中,请求达到数据库,导致数据库压力增加,进而引起存储服务故障,引起雪崩. 为什么会出现缓存雪崩? 请求中大量数据同时过期,导致大量请求无法命中. 怎么 ...

  10. redis缓存穿透,缓存击穿,缓存雪崩

    缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有.这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询).这样请求就会绕过 ...

最新文章

  1. Gogs-Windows Server下搭建Git服务器
  2. Python内置方法大全
  3. js前台编码,asp.net后台解码 防止前台传值到后台为乱码
  4. 巧解C语言运算符的优先级和结合性
  5. MongoDB系列之——安装和启动
  6. Gartner分享物联网和智慧城市最新数据
  7. KMP算法的核心,是一个被称为部分匹配表(Partial Match Table)的数组以及next数组求解
  8. energy in transition课文翻译_思迪软件科技 招聘 字幕翻译(远程兼职)
  9. 彻底搞懂“红黑树”......
  10. 大龄程序员怎样渡过中年危机?很多思考,挺有意思的。
  11. 广告和间谍程序克星Spybot使用说明
  12. 离合器膜片弹簧的优化设计matlab,汽车离合器膜片弹簧结构优化设计(本科毕业论文设计)...
  13. BZOJ2001 HNOI2010 城市建设
  14. 转载:typhoon 必备英文词汇
  15. 信息规范和信息安全素养计算机,技师学院计算机专业学生信息安全意识培养的教学研究...
  16. 【UI界面开发】基本组件——滑杆
  17. 京东技术助力十余省抗击疫情 应急资源平台已提供超6.6亿件抗疫物资
  18. 郝健: Linux内存管理学习笔记-第2节课
  19. STM32_基础入门_程序下载的两种方式
  20. 超声波之纵波(按照超声波类型)

热门文章

  1. cleverhans与foolbox的对比使用(pytorch+python3)
  2. 【观察】软件行业创新进入“新周期”,如何在变局中开新局?
  3. 电子试验的标准 GB2423
  4. 全球及中国嵌入式芯片行业市场调查及投资战略研究报告2022-2028年
  5. MINIUI的Combobox控件传值小问题
  6. 移动硬盘数据恢复软件丢失如何找回
  7. Java入门面试视频资源汇总
  8. 人民银行社会招聘2021计算机考试内容,2021人行招聘考试内容一览
  9. 计算机考研专业课真题,计算机考研专业课 408 真题 20092013完美打印版.pdf
  10. “n词酷”输入法模式分析及展望