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击穿雪崩击穿的信息,请关注我们的其他相关文章!

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