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