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 sentinel 频繁主备切换的问题
Apr 12 Redis
Redis安装启动及常见数据类型
Apr 14 Redis
Redis性能监控的实现
Jul 09 Redis
Redis三种集群模式详解
Oct 05 Redis
Redis Stream类型的使用详解
Nov 11 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
Redis基本数据类型Zset有序集合常用操作
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中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
JavaScript实现获取select下拉框中第一个值的方法
2018/02/06 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
python+opencv实现阈值分割
2018/12/26 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
行政助理求职自荐信
2013/10/26 职场文书
行政总监岗位职责
2013/12/05 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫
win10输入法不见了只能打出字母怎么解决?
2022/08/05 数码科技