redis击穿和穿透的解决方法,redis雪崩和穿透,击穿的解决方法

redis击穿和穿透的解决方法,redis雪崩和穿透,击穿的解决方法,redis击穿 雪崩 穿透超详细解决方案梳理

本文主要介绍Redis击穿雪崩的原因及解决方法。有需要的朋友可以借鉴一下。希望能有所帮助,祝你进步很大。

Redis击穿

Redis缓存崩溃是指一个非常热的键(即在客户端搜索的关键字较多)突然失效。这时候客户端发来的大量请求在redis中找不到这个键,就会在数据中寻找,最终导致数据库因为压力过大而崩溃。

解决方案:

1.将值的限制设置为永不过期非常简单粗暴,但是安全可靠。但是占用空间大,消耗内存多。个人不推荐这种方法,要根据具体的业务逻辑来操作。

2.用Timetask做一个定时任务。每隔一段时间对某个热键进行数据库查询,并将查询结果更新到redis。前提条件是不会给数据库造成太大压力。

3.通过同步的双重检查机制,当reids穿透发生时,大量的请求被发送到数据库。此时,我们的解决方案是只让一个线程查询这个热键,其他线程保持阻塞状态(可以让它们休眠几秒)。当进入数据库的线程找到key对应的值时,我们会将其同步到redis的缓存中,其他线程醒来后会再次去redis请求数据。

示例:

私有静态volaite对象obj=new Object();

公共字符串getValue(字符串键){

String value=redis.get(key,string . class);

if(value==null | | string utils . is blank(value){

同步(对象){

//进入synchronized后在redis中再次检查,防止最后一个抢锁的线程被更新。

value=redis.get(key,string . class);

if(value==null | | string utils . is blank(value){

value=db . query(key);

redis.set(键,值,1000);

}

}

}

返回值;

}

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

Redis雪崩

是指当大量请求查询多个键时,此时redis缓存失效或者找不到,然后大量请求都去db查询,导致db压力骤增,崩溃。

出现原因:

1 .钥匙同时失灵。

2.redis本身崩溃了

解决方案:

1.设置缓存时,随机初始化其到期时间。

如果redis的key同时失效,可以采用这种方法。具体故障时间根据业务情况确定…

2.将不同的热点键放在不同的节点上。

由于redis一般部署在集群中,通过将不同的热点键均匀地放置在不同的节点中,也可以有效地避免雪崩。

3.将值的限制设置为永不过期

4.使用Timetask做一个定时任务,在失败之前再次刷redis缓存。

Redis穿透

因为不良用户频繁恶意查询,会给系统造成很大的问题:密钥缓存和数据库不存在,所以每次查询都会查询数据库,导致数据库崩溃。

(比如数据库中存储的数据的主键都是自增的,没有负数。一些黑客利用这一点,不断使用主键id为-1的参数发起海量查询请求。导致这些请求在redis中找不到对应的数据,只能在数据库中查询,导致数据库崩溃。)

解决方案:

1.当发送类似的请求时,无论找到什么结果,都将放入redis缓存中。

这样,下次他用相同的参数发起请求时,他将直接进入redis,而不是进入数据库。

入侵其ip

3.检查请求参数的合法性,在判断其非法的前提下直接返回。

使用布鲁姆过滤器

Bloom filter可以理解为白名单,也可以理解为黑名单,它的作用是判断一个元素是否存在于这个过滤器中。

白名单:过滤器包含数据库中所有合法的参数键,请求通过Bloom过滤器。Bloom filter判断这个请求的key是否在过滤器中,然后让请求进入redis,如果不在,直接返回空数据。

公共静态void main(String[] args){

Config Config=new Config();

config.useSingleServer()。set address(' redis://127 . 0 . 0 . 1:6379 ');

config.useSingleServer()。set password(' 1234 ');

//构造Redsson

redis son client redis son=redis son . create(config);

RBloomFilterString bloom filter=redis son . get bloom filter(' phone list ');//命名我们自定义的Bloom filter phoneList,取任意名字。

//初始化布隆过滤器。预期元素为100000000L,误差率为3%

bloomFilter.tryInit(100000000L,0.03);

//将10086插入布隆过滤器

bloom filter . add(' 10086 ');

//确定布隆过滤器中是否存在以下数字。

//假

system . out . println(' 123456 ');

//真

system . out . println(' 10086 ');

}

缺点:

Bloom filter可能会造成误判,从而将redis渗透到DB中,但这种误判概率很小。

以上是整理redis击穿雪崩击穿超详细解的详细内容。更多关于redis击穿雪崩击穿的信息,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 关于redis数据库入门详细介绍图片,redis数据库的使用,关于Redis数据库入门详细介绍
  • redis队列操作命令,redis 循环队列
  • redis队列操作命令,redis 循环队列,redis实现简单队列
  • redis部署应用服务器上,redis如何启动服务器
  • redis部署应用服务器上,redis如何启动服务器,搭建Redis服务器步骤详细介绍
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决,redis缓存穿透解决方法
  • Redis缓存,redis和缓存
  • Redis缓存,redis和缓存,Redis缓存详解
  • redis的配置,启动,操作和关闭方法有哪些,关闭redis的命令,Redis的配置、启动、操作和关闭方法
  • redis的主从配置方法详解图,Redis主从配置
  • redis的主从配置方法详解图,Redis主从配置,redis的主从配置方法详解
  • redis界面工具,mac安装redis可视化工具
  • redis界面工具,mac安装redis可视化工具,推荐几款 Redis 可视化工具(太厉害了)
  • redis正确使用的十个技巧是什么,redis正确使用的十个技巧有哪些
  • 留言与评论(共有 条评论)
       
    验证码: