Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >高并发下缓存穿透、击穿、雪崩问题的解决方案,落地到代码该如何实现?

高并发下缓存穿透、击穿、雪崩问题的解决方案,落地到代码该如何实现?

作者头像
冰河
发布于 2023-08-09 06:58:39
发布于 2023-08-09 06:58:39
3780
举报
文章被收录于专栏:冰河技术冰河技术

大家好,我是冰河~~

记得在《【高并发】Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!》一文中,我们以高并发秒杀系统中扣减库存的场景为例,说明了Redis是如何助力秒杀系统的。那么,说到Redis,往往更多的场景是被用作系统的缓存,说到缓存,尤其是分布式缓存系统,在实际高并发场景下,稍有不慎,就会造成缓存穿透、缓存击穿和缓存雪崩的问题。

那什么是缓存穿透?什么是缓存击穿,又什么是缓存雪崩呢?它们是如何造成的?又该如何解决呢?这次,我们不仅仅是从理论上来阐述这些内容,冰河更是开源了生产级高并发场景下缓存穿透、击穿和雪崩问题解决方案的落地代码,让你掌握的不仅仅是理论知识,更是落地到代码的解决方案。

缓存穿透

首先,我们来说说缓存穿透。什么是缓存穿透呢?缓存穿透问题在一定程度上与缓存命中率有关。如果我们的缓存设计的不合理,缓存的命中率非常低,那么,数据访问的绝大部分压力都会集中在后端数据库层面。

什么是缓存穿透?

如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数据库层都没有命中数据,那么,这种情况就叫作缓存穿透。

我们可以使用下图来表示缓存穿透的现象。

造成缓存穿透的主要原因就是:查询某个Key对应的数据,Redis缓存中没有相应的数据,则直接到数据库中查询。数据库中也不存在要查询的数据,则数据库会返回空,而Redis也不会缓存这个空结果。这就造成每次通过这样的Key去查询数据都会直接到数据库中查询,Redis不会缓存空结果。这就造成了缓存穿透的问题。

如何解决缓存穿透问题?

既然我们知道了造成缓存穿透的主要原因就是缓存中不存在相应的数据,直接到数据库查询,数据库返回空结果,缓存中不存储空结果。

那我们就自然而然的想到了第一种解决方案:就是把空对象缓存起来。当第一次从数据库中查询出来的结果为空时,我们就将这个空对象加载到缓存,并设置合理的过期时间,这样,就能够在一定程度上保障后端数据库的安全。

第二种解决缓存穿透问题的解决方案:就是使用布隆过滤器,布隆过滤器可以针对大数据量的、有规律的键值进行处理。一条记录是不是存在,本质上是一个Bool值,只需要使用 1bit 就可以存储。我们可以使用布隆过滤器将这种表示是、否等操作,压缩到一个数据结构中。比如,我们最熟悉的用户性别这种数据,就非常适合使用布隆过滤器来处理。

缓存击穿

如果我们为缓存中的大部分数据设置了相同的过期时间,则到了某一时刻,缓存中的数据就会批量过期。

什么是缓存击穿?

如果缓存中的数据在某个时刻批量过期,导致大部分用户的请求都会直接落在数据库上,这种现象就叫作缓存击穿。

我么可以使用下图来表示缓存击穿的线程。

造成缓存击穿的主要原因就是:我们为缓存中的数据设置了过期时间。如果在某个时刻从数据库获取了大量的数据,并设置了相同的过期时间,这些缓存的数据就会在同一时刻失效,造成缓存击穿问题。

如何解决缓存击穿问题?

对于比较热点的数据,我们可以在缓存中设置这些数据永不过期;也可以在访问数据的时候,在缓存中更新这些数据的过期时间;如果是批量入库的缓存项,我们可以为这些缓存项分配比较合理的过期时间,避免同一时刻失效。

还有一种解决方案就是:使用分布式锁,保证对于每个Key同时只有一个线程去查询后端的服务,某个线程在查询后端服务的同时,其他线程没有获得分布式锁的权限,需要进行等待。不过在高并发场景下,这种解决方案对于分布式锁的访问压力比较大。

缓存雪崩

如果缓存系统出现故障,所有的并发流量就会直接到达数据库。

什么是缓存雪崩?

如果在某一时刻缓存集中失效,或者缓存系统出现故障,所有的并发流量就会直接到达数据库。数据存储层的调用量就会暴增,用不了多长时间,数据库就会被大流量压垮,这种级联式的服务故障,就叫作缓存雪崩。

我们可以用下图来表示缓存雪崩的现象。

造成缓存雪崩的主要原因就是缓存集中失效,或者缓存服务发生故障,瞬间的大并发流量压垮了数据库。

如何解决缓存雪崩问题?

解决缓存雪崩问题最常用的一种方案就是保证Redis的高可用,将Redis缓存部署成高可用集群(必要时候做成异地多活),可以有效的防止缓存雪崩问题的发生。

为了缓解大并发流量,我们也可以使用限流降级的方式防止缓存雪崩。例如,在缓存失效后,通过加锁或者使用队列来控制读数据库写缓存的线程数量。具体点就是设置某些Key只允许一个线程查询数据和写缓存,其他线程等待。则能够有效的缓解大并发流量对数据库打来的巨大冲击。

另外,我们也可以通过数据预热的方式将可能大量访问的数据加载到缓存,在即将发生大并发访问的时候,提前手动触发加载不同的数据到缓存中,并为数据设置不同的过期时间,让缓存失效的时间点尽量均匀,不至于在同一时刻全部失效。

落地代码

冰河已经将高并发场景下解决缓存穿透、击穿、雪崩问题的通用方案落地到代码,并开源,旨在让大家从源码级别更好的掌握解决缓存穿透、击穿和雪崩问题的通用方案。

开源项目是基于Redis解决缓存击穿、穿透和雪崩问题的通用解决方案,拿来即用。支持存储对象、集合、简单数据类型等。无需提前将数据存入Redis,直接使用提供的分布式缓存接口查询数据即可,附带完善的单元测试用例,方便学习使用,另外,项目的README.md文件中附带详细的核心接口定义、使用案例和单元测试场景。

开源地址如下,如果这个开源项目对你有点帮助,请给这个开源项目点个Star,万分感谢!

  • github:https://github.com/binghe001/spring-redis
  • gitee:https://gitee.com/binghe001/spring-redis
  • gitcode:https://gitcode.net/binghe001/spring-redis
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰河技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis缓存雪崩、穿透、击穿三步曲
本文收集了一些 Redis 使用中经常遇到的一些问题,和与之相对应的解决方案,这些内容不但会出现在实际工作中,也是面试的高频问题,接下来一起来看。
wayn
2024/04/28
2530
Redis缓存雪崩、穿透、击穿三步曲
缓存穿透,缓存击穿,缓存雪崩解决方案分析
设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。
java思维导图
2018/07/26
6420
缓存穿透,缓存击穿,缓存雪崩解决方案分析
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。
码哥字节
2022/04/08
1.5K0
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
什么是redis的缓存穿透,缓存击穿和缓存雪崩?
是指查询一个不存在的数据,mysql查询不到数据,也不会直接写入缓存,每次请求都要去查数据库。可能导致数据库挂掉,这种情况大概率是遭到了攻击。
reload
2024/04/17
6450
什么是redis的缓存穿透,缓存击穿和缓存雪崩?
高并发下缓存雪崩、穿透、击穿了,你该如何挽救
在今天的互联网里,高并发、大数据量、大流量已经成为了代言词,那么我们的系统也承受着巨大的压力,首当其冲的解决方案就是redis。
公众号 IT老哥
2020/09/16
9370
高并发下缓存雪崩、穿透、击穿了,你该如何挽救
来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?
看到题目就知道了,这又是我在面试中遇到的,最近面试,把我的博文质量感觉都提上来了。面一次试感觉够我总结一周的,但还是每次都能遇到知识盲点,那以后就当面试总结是个扫盲的过程吧。
纪莫
2020/09/18
6120
Java缓存穿透、击穿、雪崩解决方案
在互联网高并发的场景下,对于数据库查询频率高的数据,为了提高查询效率,常常会采用缓存技术进行优化。然而,缓存技术也会带来一些问题,比如缓存穿透、缓存击穿和缓存雪崩等。
青山师
2023/05/05
2480
【Redis实战】面试热点:缓存穿透、缓存击穿、缓存雪崩的区别和解决方案
  先读cache,如果数据命中则返回;如果数据未命中则读db;将db中读取出来的数据入缓存。
程序员云帆哥
2022/05/12
3140
【Redis实战】面试热点:缓存穿透、缓存击穿、缓存雪崩的区别和解决方案
Redis之缓存穿透,雪崩,击穿解读
当我们请求去查询一条记录,先到redis中查询后到mysql查询都发现找不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。这种现象我们称为缓存穿透,这个redis变成了一个摆设。
一个风轻云淡
2023/10/15
3290
什么是缓存雪崩、击穿、穿透?
用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。
全栈程序员站长
2022/09/12
4740
什么是缓存雪崩、击穿、穿透?
Redis缓存雪崩、缓存穿透、缓存击穿解决方案详解
像电商项目,一般采取将不同分类的商品,缓存不同周期。在同一分类中的商品,加上一个随机因子。尽可能分散缓存过期时间,而且,热门类目的商品缓存时间长一些,冷门类目的商品缓存时间短一些,也能节省缓存服务的资源。
JavaEdge
2022/11/30
1.2K0
Redis缓存雪崩、缓存穿透、缓存击穿解决方案详解
Redis使用|缓存穿透,雪崩,击穿以及解决方案分析
作为一种非关系型数据库,redis也总是免不了有各种各样的问题,这篇文章主要是针对其中三个问题进行讲解:缓存穿透、缓存击穿和缓存雪崩,并给出一些解决方案。
浅羽技术
2020/12/07
8660
Redis使用|缓存穿透,雪崩,击穿以及解决方案分析
缓存穿透、雪崩、击穿解决方案
​ 正常情况下,使用缓存的话,大部分数据都会命中缓存(缓存不存在或者过期的话,也只有一次会查询数据库),可以极大的减轻数据库的压力。
公众号 云舒编程
2024/01/25
1.4K0
Redis 面试常见问题:缓存雪崩、缓存击穿以及缓存穿透
缓存雪崩是指大量的请求无法在缓存中处理,从而将请求转移到数据库中,导致数据压力倍增。一个Redis实例可以支持万级别的并发请求,而单个数据库只能支持千级别的并发请求。两者处理请求并发能力相差十倍,数据库会由于压力过大而导致雪崩。这里雪崩一般是由两个原因组成,很多文章只写缓存同时过期的情况。
用户10384376
2023/02/25
1.1K0
Redis 面试常见问题:缓存雪崩、缓存击穿以及缓存穿透
常见的缓存穿透,缓存击穿,缓存雪崩解决方案分析
作者:zeb_perfect 来源:blog.csdn.net/zeb_perfect 前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 解决方案 有很多种方法可以有效地解决
Tanyboye
2018/07/02
2.4K0
Redis击穿、穿透、雪崩产生原因以及解决思路
大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下 ,当缓存中某一个热点key失效,
芋道源码
2021/11/10
4980
Redis击穿,穿透,雪崩产生原因及其解决思路
大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是,无论是击穿还是后面谈到的穿透与雪崩,都是在高并发前提下,当缓存中某一个热点key失效,
iginkgo18
2022/01/13
6050
Redis-缓存雪崩、缓存击穿、缓存穿透
Redis作为目前使用最广泛的缓存,相信大家都不陌生。但是使用缓存并没有这么简单,还要考虑缓存雪崩,缓存击穿,缓存穿透的问题,什么是缓存雪崩,击穿,穿透呢,出现这些问题又怎么解决呢,接下来学习一下吧。
java技术爱好者
2021/02/05
1.3K0
Redis-缓存雪崩、缓存击穿、缓存穿透
Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级
Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级。本篇分别介绍这些概念以及对应的解决方案。
王知无-import_bigdata
2020/07/22
12.2K0
Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级
Redis中的缓存雪崩、缓存击穿、缓存穿透问题
当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,这种情况会导致连锁反应,整个系统可能会崩溃。
孟斯特
2023/10/25
3010
Redis中的缓存雪崩、缓存击穿、缓存穿透问题
推荐阅读
相关推荐
Redis缓存雪崩、穿透、击穿三步曲
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文