redis缓存雪崩 缓存穿透 缓存击穿如何解决_redis穿透和雪崩解决

redis缓存雪崩 缓存穿透 缓存击穿如何解决_redis穿透和雪崩解决一:redis雪崩redis雪崩是指redis在某个时间大量失效,突然造成数据库访问压力急剧增大,像雪崩一样,redis雪崩危害巨大,甚至有可能服务器宕机,给公司造成巨大的经济损失。解决方案:设置超时时间的时候要设置随机值,不要设置固定值*缓存雪崩:key在同一时间失效,导致大量请求去访问数据库*返回min和max之间的一个随机秒数 privateLonggetRandomExpirationTime(Integermin,Integermax){

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一:redis雪崩

redis雪崩是指redis在某个时间大量失效,突然造成数据库访问压力急剧增大,像雪崩一样,redis雪崩危害巨大,甚至有可能服务器宕机,给公司造成巨大的经济损失。

解决方案:设置超时时间的时候要设置随机值,不要设置固定值

     * 缓存雪崩: key在同一时间失效,导致大量请求去访问数据库
     * 返回min 和max 之间的一个随机秒数
	private Long getRandomExpirationTime(Integer min, Integer max) {
        return RandomUtils.nextLong(min * 60 * 60, max * 60 * 60);
    }

二: redis缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。

在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

1.设置并发锁,防止请求大量请求数据库,如果获取到锁了,去数据库查询,如果没有,说明有其他线程在查询数据库,那么只需要重试一下就好了

public String get(key) { 
   
      String value = redis.get(key);
      if (value == null) { 
    //代表缓存值过期
          //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
	       if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { 
     //代表设置成功
		       value = db.get(key);
		       redis.set(key, value, expire_secs);
		       redis.del(key_mutex);
	       } else { 
     //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
		      Thread.sleep(50);
		      get(key);  //重试
	       }
       } else { 
   
              return value;      
       }
}

2.设置拦截器,对于不存在得key,进行拦截

三:缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

解决方案:
1.设置热点数据永不过期
2.加互斥锁

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194031.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis-plus mapper-locations(grbl源码分析)

    BaseMapper接口继承该接口后,无需编写mapper.xml文件,即可获得CRUD功能publicinterfaceBaseMapper<T>{/***<p>*插入一条记录*</p>**@paramentity实体对象*/intinsert(Tentity);/***<p>*根据ID删除

    2022年4月17日
    150
  • GateWay网关 – 环境搭建v2「建议收藏」

    GateWay网关 – 环境搭建v2「建议收藏」目录基础使用Maven依赖application配置Gateway整合Nacos实现服务转发Maven依赖application配置自定义TokenFilter实现参数拦截gateWay高可用集群方式基础使用Maven依赖注意:不能引入spring-cloud-starter-web,会出现错误<parent>…

    2022年9月13日
    0
  • HTML5 Canvas彩色小球碰撞运动特效

    脚本简介HTML5Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效。效果展示 http://hovertree.com/texiao/html5/

    2021年12月27日
    39
  • 深入了解mysql它BDB系列(1)—BDB基础知识

    深入了解mysql它BDB系列(1)—BDB基础知识

    2021年12月30日
    20
  • html邮件签名制作,制作自己的个性化电子邮件签名[通俗易懂]

    html邮件签名制作,制作自己的个性化电子邮件签名[通俗易懂]制作自己的个性化电子邮件签名您是不是经常给朋友发E-mail?如果每个邮件中都有一个精美的签名文件,文件中包括通讯地址、邮政编码以及电话、手机、QQ号码等联系方法,甚至可以包含简单的声音文件,并且每次在OutlookExpress中新建邮件时,可以自动签名——岂不很美?我们就一起来制作这样一个签名文件。1、启动OE,单击工具栏“新邮件”按钮,打开“新邮件”窗口。输入签名内容,包括通讯地址、电话…

    2022年10月9日
    0
  • 数字证书理解(CA证书签名原理)[通俗易懂]

    数字证书理解(CA证书签名原理)[通俗易懂]目的为了防止中间人攻击和钓鱼基础概念(要求预先了解的知识概念)对称密钥体系(对称加密)和非对称密钥体系(非对称加密)都提供2份秘钥。公钥私钥是概念上的,发布出去的为公钥,留在手上的为私钥,实质上不存在公私钥区别。特殊的:在实际操作中,生成RSA(特别的:一种加密方式)密钥时会有两个秘钥,其中一份包含另一份的完整信息【此时默认命名为私钥】——->这就是为什么私钥可以推导出公…

    2022年6月1日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号