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.加互斥锁

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JMeter参数化4种实现方式「建议收藏」

    JMeter参数化4种实现方式「建议收藏」前言下面是目前JMeter系列已有博文列表,持续更新中:JMeter安装与接口测试入门JMeter接口测试之断言实现JMeter逻辑控制器JMeter配置元件JMeter操作Mysql数据库BeanShellSampler与BeanShell断言JMeterLinux下执行测试JMeter自定义日志与日志分析1参数化释义什么是参数化?从字面上去理解的话,就是事先准备好数据(广义上来说,可以是具体的数据值,也可以是数据生成规则),而非在脚本中写死,脚本执行时从准备好的数据中

  • maven编译 Process terminated【已解决】

    maven编译 Process terminated【已解决】maven项目编译报错如下:点击【项目名】提示点击蓝色报错的链接,在idea中打开了settings文件,找到提示的报错位置最后发现是缩进或者空格不对导致该问题,建议在notepa++中复制粘贴过来就好了…

  • mysql命令备份

    mysql命令备份mysql命令备份

  • 高并发的解决方案「建议收藏」

    高并发的解决方案「建议收藏」1.应用和静态资源分离刚开始的时候应用和静态资源是保存在一起的,当并发量达到一定程度的时候就需要将静态资源保存到专门的服务器中,静态资源主要包括图片、视频、js、css和一些资源文件等,这些文件因为没有状态所以分离比较简单,直接存放到响应的服务器就可以了,一般会使用专门的域名去访问。通过不同的域名可以让浏览器直接访问资源服务器而不需要再访问应用服务器了。架构图如下:2.页面缓存

  • python中str函数

    python中str函数str函数str将数据强制转换为字符串。每种数据类型都可以强制转换为字符串。例4.6.str介绍>>>str(1)'1'>>>horse

发表回复

您的电子邮箱地址不会被公开。

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