redis击穿 雪崩 穿透超详细解决方案梳理


Posted in Redis onMarch 17, 2022

Redis击穿

redis缓存击穿是指某一个非常热点的key(即在客户端搜索的比较多的关键字)突然失效了,这时从客户端发送的大量的请求在redis里找不到这个key,就会去数据里找,最终导致数据库压力过大崩掉。

redis击穿 雪崩 穿透超详细解决方案梳理

解决方案:

1.将value的时效设置成永不过期 这种方式非常简单粗暴但是安全可靠。但是非常占用空间对内存消耗也是极大。个人并不建议使用该方法,应该根据具体业务逻辑来操作。

2.使用Timetask做一个定时任务 使用Timetask做定时,每隔一段时间对一些热点key进行数据库查询,将查询出的结果更新至redis中。前条件是不会给数据库过大的压力。

3.通过synchronized+双重检查机制 当发生reids穿透的时候,这时海量请求发送到数据库。这时我们的解决办法是只让只让一个线程去查询这个热点key,其它线程保持阻塞状态(可以让它们sleep几秒)。当这个进入数据库的线程查询出key对应的value时,我们再将其同步至redis的缓存当中,其它线程睡醒以后再重新去redis里边请求数据。

例子:

private static volaite Object obj = new Object();
   public String getValue(String key){
     String value=redis.get(key,String.class);
     if(value==null||StringUtils.isBlank(value){
         synchronized(obj){
         		//进入synchronized以后再去redis里查一遍,防止上一个抢到锁的线程已经更新过了。
                value=redis.get(key,String.class);
                 if(value==null||StringUtils.isBlank(value){
                     value=db.query(key);
                      redis.set(key,value,1000); 
          }
       }
     }    
      return value;
   }

缺点:存在死锁和线程阻塞的风险。

Redis雪崩

指的是当海量的请求去查询多个key时,此时redis缓存中失效或者查不到,然后海量的请求都去都去db查询,从而导致db压力突然飙升崩溃。

出现原因:

1.key同时失效

2.redis本身崩溃了

redis击穿 雪崩 穿透超详细解决方案梳理

解决方案:

1.设置缓存时,随机初始化其失效时间

如果是redis的key同时失效,可采取该办法,具体失效时间根据业务情况决定…

2.将不同的热点key放置到不同的节点上去

因redis一般都是集群部署,将不同的热点key平均的放置到不同节点,也可以有效避免雪崩。

3.将value的时效设置成永不过期

4.使用Timetask做一个定时任务,在失效之前重新刷redis缓存

Redis穿透

因为不良用户恶意频繁查询才会对系统造成很大的问题: key缓存并且数据库不存在,所以每次查询都会查询数据库从而导致数据库崩溃。

(例如:我们在数据库存放的数据其主键都是自增且没有负数的,某些黑客就利用这一点,不断用主键id为-1的参数来发起海量查询请求,导致这些请求在redis中查不到相应的数据,只能去数据库中查询,从而导致数据库崩溃。)

redis击穿 雪崩 穿透超详细解决方案梳理

解决方案:

1.当类似的请求发过来,无论查出什么结果都放入redis缓存

这样解决当他下次再用同一个参数发起请求时,会直接进到redis里边去,不会再进入数据库。

2.拉黑其ip

3.对请求的参数进行合法性校验,在判断其不合法的前提下直接return掉

4.使用布隆过滤器

可以将布隆过滤器理解成一个白名单或者黑名单,它的作用就是判断一个元素是否存在于这个过滤器。

白名单: 过滤器里有数据库中所有的合法的参数key,请求经过布隆过滤器,布隆过滤器判断这个请求的key在不在过滤器,在就放行让请求进入redis,不在就直接return空数据。

redis击穿 雪崩 穿透超详细解决方案梳理

public static void main(String[] args){
	Config config = new Config();
	config.useSingleServer().setAddress("redis://127.0.0.1:6379");
	config.useSingleServer().setPassword("1234");
	//构造Redsson
	RedissonClient redisson = Redisson.create(config);
	RBloomFilter<String> bloomFilter = redisson.getBloomFilter("phoneList");//给我们自己定义的布隆过滤器取名叫phoneList,名字随便取
	//初始化布隆过滤器设置预计元素为100000000L, 误差率为3%
	bloomFilter.tryInit(100000000L,0.03);
	//将10086插入到布隆过滤器中
	bloomFilter.add("10086");
	//判断下面号码是否存在布隆过滤器中
	//false
	System.out.println("123456");
	//true
	System.out.println("10086");
}

缺点:

布隆过滤器可能会造成误判,从而穿透redis进入DB,但是这个误判概率是非常小的。

以上就是redis击穿 雪崩 穿透超详细解决方案梳理的详细内容,更多关于redis 击穿 雪崩 穿透的资料请关注三水点靠木其它相关文章!

Redis 相关文章推荐
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
浅谈Redis在直播场景的实践方案
Apr 27 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
Redis缓存-序列化对象存储乱码问题的解决
Jun 21 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
redis 解决库存并发问题实现数量控制
Apr 08 Redis
Redis官方可视化工具RedisInsight安装使用教程
Apr 19 Redis
windows安装 redis 6.2.6最新步骤详解
Apr 26 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 Redis
Redis调用Lua脚本及使用场景快速掌握
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Redis中有序集合的内部实现方式的详细介绍
Mar 16 #Redis
面试分析分布式架构Redis热点key大Value解决方案
分布式架构Redis中有哪些数据结构及底层实现原理
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 #Redis
You might like
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
php图像验证码生成代码
2017/06/08 PHP
JS分割字符串并放入数组的函数
2011/07/04 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
js post提交调用方法
2014/02/12 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
基于Jquery实现焦点图淡出淡入效果
2015/11/30 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
bootstrap布局中input输入框右侧图标点击功能
2016/05/16 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
js类的继承定义与用法分析
2019/06/21 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
python常用运维脚本实例小结
2020/02/14 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
一道输出判断型Java面试题
2014/10/01 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
贷款承诺书范文
2014/05/19 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
详解 TypeScript 枚举类型
2021/11/02 Javascript