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

 更新时间:2022年03月16日 15:34:57   作者:懒懒张187  
这篇文章主要为大家介绍了Redis击穿穿透雪崩产生原因及解决思路的解决方案参考,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步

Redis击穿

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

解决方案:

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本身崩溃了

解决方案:

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

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

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

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

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

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

Redis穿透

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

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

解决方案:

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

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

2.拉黑其ip

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

4.使用布隆过滤器

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

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

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中bitmap的原理和使用详解

    关于Redis中bitmap的原理和使用详解

    这篇文章主要介绍了关于Redis中bitmap的原理和使用详解,BitMap即位图,使用每个位表示某种状态,适合处理整型的海量数据,本质上是哈希表的一种应用实现,需要的朋友可以参考下
    2023-05-05
  • Quarkus集成redis操作Redisson实现数据互通

    Quarkus集成redis操作Redisson实现数据互通

    这篇文章主要为大家介绍了Quarkus集成redis操作Redisson实现数据互通的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Redis实战之商城购物车功能的实现代码

    Redis实战之商城购物车功能的实现代码

    这篇文章主要介绍了Redis实战之商城购物车功能的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 浅谈redis缓存在项目中的使用

    浅谈redis缓存在项目中的使用

    最近由于项目需要,在系统缓存服务部分上用到了redis,本文就浅谈下在redis缓存在项目中的使用,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Redis+threading实现多线程消息队列的使用示例

    Redis+threading实现多线程消息队列的使用示例

    Redis多线程消息队列是一种使用Redis作为存储后端的消息队列实现,它利用Redis的线程并发处理能力来提高消息队列的处理效率,本文主要介绍了Redis+threading实现多线程消息队列的使用示例,感兴趣的可以了解一下
    2023-12-12
  • Redis GEO地理信息定位功能

    Redis GEO地理信息定位功能

    Redis 提供了GEO地理信息定位功能,地理空间项(经度、纬度、名称),实现查找附近的人、上班打卡、自行车租赁、摇一摇等相关与地理位置信息的功能,这篇文章主要介绍了Redis GEO地理信息定位功能,需要的朋友可以参考下
    2023-12-12
  • redis启动流程介绍

    redis启动流程介绍

    这篇文章主要介绍了redis启动流程介绍,本文更分5步,分别是准备运行环境、解析命令行参数、initServer()初始化服务、loadDataFromDisk()从rdb或aof文件加载数据、aeMain()开始事件循环,接收客户端请求,需要的朋友可以参考下
    2015-01-01
  • redis实现简单队列

    redis实现简单队列

    这篇文章主要为大家详细介绍了redis实现简单队列的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Redis并发访问问题详细讲解

    Redis并发访问问题详细讲解

    本文主要介绍了Redis如何应对并发访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-12-12
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析

    这篇文章主要为大家详细的介绍了Redis高效的原因以及分析了Redis高效的数据结构,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09

最新评论