文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

redis击穿、雪崩和穿透问题怎么解决

2023-06-29 13:25

关注

这篇文章主要讲解了“redis击穿、雪崩和穿透问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis击穿、雪崩和穿透问题怎么解决”吧!

Redis击穿

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

redis击穿、雪崩和穿透问题怎么解决

解决方案:

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

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

通过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压力突然飙升崩溃。

出现原因:

key同时失效

redis本身崩溃了

redis击穿、雪崩和穿透问题怎么解决

解决方案:

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

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

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

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

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

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

Redis穿透

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

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

redis击穿、雪崩和穿透问题怎么解决

解决方案:

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

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

拉黑其ip

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

使用布隆过滤器

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

白名单: 过滤器里有数据库中所有的合法的参数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");//构造RedssonRedissonClient redisson = Redisson.create(config);RBloomFilter<String> bloomFilter = redisson.getBloomFilter("phoneList");//给我们自己定义的布隆过滤器取名叫phoneList,名字随便取//初始化布隆过滤器设置预计元素为100000000L, 误差率为3%bloomFilter.tryInit(100000000L,0.03);//将10086插入到布隆过滤器中bloomFilter.add("10086");//判断下面号码是否存在布隆过滤器中//falseSystem.out.println("123456");//trueSystem.out.println("10086");}

缺点:

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

感谢各位的阅读,以上就是“redis击穿、雪崩和穿透问题怎么解决”的内容了,经过本文的学习后,相信大家对redis击穿、雪崩和穿透问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯