Redis中缓存穿透/击穿/雪崩问题和解决方法


Posted in Redis onDecember 04, 2021

缓存问题

1. 缓存穿透---查不到

缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就向持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了。

当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透。

Redis中缓存穿透/击穿/雪崩问题和解决方法

解决方案

第一种解决方案:使用布隆过滤器

使用布隆过滤器之后,将存储的数据放入布隆过滤器中,每次数据查询首先查询布隆过滤器,当在过滤器中判断存在时,再到缓存查询,如果没有,再进入数据查询。

如果在布隆过滤器中不存在,则直接返回告诉用户该数据查不到,这样能大大减轻数据库查询压力。

Redis中缓存穿透/击穿/雪崩问题和解决方法

第二种方案:缓存空对象

当数据库数据不存在时,将返回的空对象缓存起来,同时设置一个过期时间,之后在访问数据时,将从缓存中获取,从而保护了数据库。

存在问题:

对空值设置过期时间,会存在更新数据库数据到缓存数据失效的这一段时间,缓存数据有问题(问题在于缓存的空对象数据,由于还没有过期,但此时数据库数据已经更新了),会对要保证数据一致性的业务造成影响。会需要更多的空间来存储更多的控制,造成内存中有大量的空值的键。

2. 缓存击穿---量太大,缓存过期

缓存击穿是指一个热点key,在不停的扛着大量的并发,当key在失效的瞬间,持续的大并发就会穿破缓存,直接请求到数据库。对数据库造成瞬间压力过大。

解决方案

第一种方案:热点数据永不过期

从缓存角度看,没有设置过期时间,就不会存在缓存过期之后产生的问题。

第二种方案:加互斥锁

使用分布式锁,保证对每个key的访问同一时刻只能一个线程去查询后端服务,其他没有获取锁权限的线程则等待即可。

3. 缓存雪崩

缓存雪崩是指在某一个时间段,缓存集中过期失效或者Redis宕机

对于数据库而言,所有请求压力会全部到达数据库,导致数据库调用量暴增,可能也造成数据库宕机的情况

Redis中缓存穿透/击穿/雪崩问题和解决方法

解决方案

第一种方案(预防为主):Redis采用高可用

这种方案的思路就是集群使用,即使一个redis挂掉,其他redis还可以继续服务。

第二种方案(降低发生时所造成的危害):限流降级

这种思路就是在缓存失效后,通过加锁或者队列来控制读取数据库的线程数量让线程在队列排队,控制整体请请求速率。

第三种方案:数据预热

数据预热即是在正式部署服务之前,先访问一遍数据,可以将大部分的数据加载到缓存中,在即将发生大并发之前已经加载不同的key,设置不同的过期时间,让缓存失效的时间更加均匀。

到此这篇关于Redis中缓存穿透/击穿/雪崩问题和解决方法的文章就介绍到这了,更多相关Redis缓存穿透/击穿/雪崩问题内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
Redis持久化与主从复制的实践
Apr 27 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
使用Redis实现点赞取消点赞的详细代码
Mar 20 Redis
Redis分布式锁的7种实现
Apr 01 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
linux下安装redis图文详细步骤
Springboot/Springcloud项目集成redis进行存取的过程解析
使用RedisTemplat实现简单的分布式锁
Nov 20 #Redis
redis缓存存储Session原理机制
CentOS8.4安装Redis6.2.6的详细过程
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 #Redis
Window server中安装Redis的超详细教程
You might like
php简单统计中文个数的方法
2016/09/30 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
javascript 定时器工作原理分析
2016/12/03 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
2016/12/16 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[50:24]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
详解纯CSS3制作的20种loading动效
2017/07/05 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
巴西女装购物网站:Eclectic
2018/04/24 全球购物
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
市场营销管理制度
2014/01/29 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
校园文化标语
2014/06/18 职场文书
社区服务活动小结
2014/07/08 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
django注册用邮箱发送验证码的实现
2021/04/18 Python