Redis——如何解决redis穿透、雪崩、击穿问题

news2025/4/6 13:07:06

目录

    • 一、查询商品信息的常规代码示例
    • 二、缓存击穿
      • 2.1、缓存击穿的理解
      • 2.2、缓存击穿的解决方案
      • 2.3、解决缓存击穿的代码示例
    • 三、缓存雪崩
      • 3.1、缓存雪崩的理解
      • 3.2、缓存雪崩的解决方案
        • 3.2.1、缓存集中过期的情况
        • 3.2.2、缓存服务器宕机的情况
        • 3.2.3、缓存服务器断电的情况
      • 3.3、解决缓存雪崩(缓存集中过期)的代码示例
    • 四、缓存穿透
      • 4.1、缓存穿透的理解
      • 4.2、缓存穿透的解决方案
      • 4.3、解决缓存穿透的代码示例

一、查询商品信息的常规代码示例

  • 查询商品信息的常规代码示例
/**
*查询商品信息
*/
public ExpressInfo findByDeliveryOrderId(Long id){
	String key="xz-express:expmess-info:"
	//从 Redis查询物流信息
	Object obj = 	redisTemplate.opsForValue().get( key + id);
	if (obi != null) [
		return (ExpressInfo) obj; 
	}else {
		ExpressInfo expressInfo= expressMapper,selectByDeliveryOrderId(id);//数据库查询	
		if(expressInfo l= nul1){ 
			redisTemplate,opsForValue(),set(key + d,expressInfo,Duration,ofHours(2));
			return expressInfo;
 		}else {
 			throw new clientException("发货单,的物流信息不存在",id);
 		}
	}
}
		

二、缓存击穿

2.1、缓存击穿的理解

  • 高并发时,当一个kev非常热点(类似于爆款)在不停的扛着大并发当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库并设置到缓存中,导致性能下降。
    在这里插入图片描述

2.2、缓存击穿的解决方案

  • 设置缓存永不过期
  • 加锁排队

2.3、解决缓存击穿的代码示例

  • 代码示例

    /**
    *查询商品信息
    */
    @Suppresswarnings("unchecked”)
    public ExpressInfo findByDeliveryOrderId(Long id){
    	String key="xz-express:expmess-info:"
    	//从 Redis查询物流信息
    	Object obj = 	redisTemplate.opsForValue().get( key + id);
    	if (obi == null) {
    		synchronized (this){
    			//进入 synchronized 一定要先再查询一次 Redis,防止上一个抢到锁的线程已经更新过了
    			obj = 	redisTemplate.opsForValue().get( key + id);
    			if(obj != null){
    				return (List<ProductCategory>) obj;
    			}
    			//数据库查询	
    			List<ProductCategory> categorylList = productCategoryMapper.selectProductCategory(id);
    			redisTemplate,opsForValue().set(key,categoryList,Duration.ofHours(2L));
    		}
    		return categorylList ; 
    	}else {
    		return (List<ProductCategory>) obj;
    	}
    }
    

三、缓存雪崩

3.1、缓存雪崩的理解

  • 缓存集中过期,或者缓存服务器宕机,导致大量请求访问数据库,造成数据库瞬间压力过大,宕机。
    在这里插入图片描述

3.2、缓存雪崩的解决方案

3.2.1、缓存集中过期的情况

  • 加锁排队
  • 设置随机失效时间

3.2.2、缓存服务器宕机的情况

  • 提前部署好redis高可用集群(比如哨兵模式)

3.2.3、缓存服务器断电的情况

  • 提前做好灾备(多机房部署)

3.3、解决缓存雪崩(缓存集中过期)的代码示例

  • 代码示例

    /**
    *查询商品信息
    */
    @Suppresswarnings("unchecked”)
    public ExpressInfo findByDeliveryOrderId(Long id){
    	String key="xz-express:expmess-info:"
    	//从 Redis查询物流信息
    	Object obj = 	redisTemplate.opsForValue().get( key + id);
    	if (obi == null) {
    		synchronized (this){
    			//进入 synchronized 一定要先再查询一次 Redis,防止上一个抢到锁的线程已经更新过了
    			obj = 	redisTemplate.opsForValue().get( key + id);
    			if(obj != null){
    				return (List<ProductCategory>) obj;
    			}
    			//数据库查询	
    			List<ProductCategory> categorylList = productCategoryMapper.selectProductCategory(id);
    			//设置随机失效时间
    			Duration expire = DurationofHours(2L).plus(Duration.ofSeconds((Math .random() 100)));
    			redisTemplate,opsForValue().set(key,categoryList,expire);
    		}
    		return categorylList ; 
    	}else {
    		return (List<ProductCategory>) obj;
    	}
    }
    

四、缓存穿透

4.1、缓存穿透的理解

  • 数据库不存在缓存中也不存在,导致每次请求都会去查询数据库,这时的用户很可能是攻击者如发起为id为“-1”的数据或id为特别大(不存在的数据),导致数据库压力过大或宕机。
    在这里插入图片描述

4.2、缓存穿透的解决方案

  • 参数校验
  • 缓存空对象
  • 布隆过滤器

4.3、解决缓存穿透的代码示例

  • 代码示例

    /**
    *查询商品信息
    */
    @Suppresswarnings("unchecked”)
    public ExpressInfo findByDeliveryOrderId(Long id){
    	String key="xz-express:expmess-info:"
    	//从 Redis查询物流信息
    	Object obj = 	redisTemplate.opsForValue().get( key + id);
    	if (obi == null) {
    		synchronized (this){
    			//进入 synchronized 一定要先再查询一次 Redis,防止上一个抢到锁的线程已经更新过了
    			obj = 	redisTemplate.opsForValue().get( key + id);
    			if(obj != null){
    				return (List<ProductCategory>) obj;
    			}
    			//数据库查询	
    			List<ProductCategory> categorylList = productCategoryMapper.selectProductCategory(id);
    			//设置随机失效时间
    			Duration expire = DurationofHours(2L).plus(Duration.ofSeconds((Math .random() 100)));
    			//从数据库中查询出的categoryList不管是否是空,都存到redis中
    			redisTemplate,opsForValue().set(key,categoryList,expire);
    		}
    		return categorylList ; 
    	}else {
    		return (List<ProductCategory>) obj;
    	}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/944286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lib61850 学习笔记一 (概念)

IEC61850 定义60多种服务满足变电站通信需求。支持在线获取数据模型&#xff0c;也支持IED水平通信&#xff08;GOOSE报文&#xff09; 术语定义 间隔 bay: 变电站由据应公共功能紧密连接的子部分组成。 例如 介于进线或者 出线 和母线之间的断路器&#xff1b;二条母线之间…

克隆 Windows 硬盘的 5 个理由

您什么时候需要克隆 Windows 硬盘&#xff1f; ​根据用户研究&#xff0c;以下是您的五个常见原因&#xff1a; 备份&#xff1a;克隆 Windows 硬盘是创建所有数据备份的推荐方法。如果发生任何硬盘故障&#xff0c;您可以快速将所有数据恢复到新硬盘。 升级&#xff1a;如…

【C51基础实验 点亮一颗LED】

51单片机项目基础篇 点亮一颗LED1、认识头文件1.1、头文件的书写格式分类1.2、头文件存放的内容 2、硬件电路设计3、软件设计4、编译结果5、结束语 点亮一颗LED 前言&#xff1a; 了解了前面篇章的内容&#xff0c;工程模板就不多赘述了&#xff0c;这篇就开始写51 单片机的第…

Compose眼珠跟随手势移动的笑脸

眼珠跟随手势移动的笑脸&#x1f601; 前言一、Canvas画图笑脸微笑眼睛和眼珠子 二、跟随手势移动transformableanimateFloatAsState 总结 前言 阅读本文需要一定compose基础&#xff0c;如果没有请移步Jetpack Compose入门详解&#xff08;实时更新&#xff09; 在网上看到有…

MySql DATE_ADD()实践

DATE_ADD() 函数使用 定义和用法 DATE_ADD() 函数向日期添加指定的时间间隔。 DATE_ADD(date,INTERVAL expr type) -- 获取当前时间2天后的时间 SELECT DATE_ADD(NOW(),INTERVAL 2 day) -- 获取当前时间2天前的时间 SELECT DATE_ADD(NOW(),INTERVAL -2 day)

2023最新MathType7.4中文版数学公式编辑器

MathType是一款专业的数学公式编辑器&#xff0c;理科生专用的必备工具&#xff0c;可应用于教育教学、科研机构、工程学、论文写作、期刊排版、编辑理科试卷等领域。可视化公式编辑器轻松创建数学方程式和化学公式。兼容Office Word、PowerPoint、Pages、Keynote、Numbers 等7…

容器和宿主机之间的存储问题

简介 作用&#xff1a;方便备份恢复数据&#xff0c;实现数据共享 一、单台机器中 用数据卷挂载 二、多台机器中 ssh 建立免密通道将数据scp过去&#xff0c;然后再用卷挂载到容器内 nfs 网络文件系统 搭建nfs服务器客户端挂载 过程如下 一.安装软件包yum install -…

tp5使用redis及redis7.2安装到window系统上面

redis安装教程 redis7.2安装到window系统上面 https://download.csdn.net/download/qq_39161501/88269037 解决方案&#xff1a;修改配置php.ini文件 打开Apache目录下的php.ini文件&#xff0c;搜索extension&#xff0c;在空白处加上下列代码&#xff1a; 注&#xff1a;e…

Cloudpods 私有云平台有哪些优势?

作为一套完整的私有云管理软件&#xff0c;我们经常会被问到 Cloudpods 和其他的同类产品相比&#xff0c;有哪些优势&#xff1f;我总结了 2 个方面&#xff0c;供大家参考。 功能方面 产品化&#xff0c;开箱即用&#xff0c;易用性较高&#xff0c;基本上都可以傻瓜式的操…

网络直播源码UDP协议搭建:为平台注入一份力量

网络直播源码中的UDP协议的定义&#xff1a; UDP协议又名用户数据报协议&#xff0c;是一种轻量级、无连接的协议。在网络直播源码平台中&#xff0c;UDP协议有着高速传输与实时性的能力&#xff0c;尤其是在网络直播源码实时性要求较高的场景&#xff0c;UDP协议的应用有着重要…

GDB 源码分析 -- 断点源码解析

文章目录 一、断点简介1.1 硬件断点1.2 软件断点 二、断点源码分析2.1 断点相关结构体2.1.1 struct breakpoint2.1.2 struct bp_location 2.2 断点源码简介2.3 break设置断点2.4 enable break2.5 disable breakpoint2.6 delete breakpoint2.7 info break 命令源码解析 三、Linu…

我想开通期权?如何开通期权账户?

场内期权的合约由交易所统一标准化定制&#xff0c;大家面对的同一个合约对应的价格都是一致的&#xff0c;比较公开透明&#xff0c;期权开户当天不能交易的&#xff0c;期权开户需要满足20日日均50万及半年交易经验即可操作&#xff0c;下文科普我想开通期权&#xff1f;如何…

软件测试的CMA和CNAS分别是什么?有什么用途和区别?

各行各业都有不同的证书&#xff0c;第三方软件检测机构也需要经过考核检验以获取认可。今天我们将围绕软件测试的CMA和CNAS展开讨论&#xff0c;以帮助您更好地了解它们的定义、区别和用途。 一、CMA软件测试&#xff1a; 1、定义&#xff1a;CMA软件测试是指基于中国计量认…

maven部署

一、下载Maven 地址&#xff1a;Maven – Download Apache Maven 二、解压缩&#xff0c;设置环境变量 tar -xvf apache-maven-3.8.8-bin.tar.gz export MAVEN_HOME/opt/apache-maven-3.8.8 export PATH$MAVEN_HOME/bin:$PATH echo $MAVEN_HOME echo $PATH mvn -v

从零开始的Hadoop学习(四)| SSH无密登录配置、集群配置

1. SSH 无密登录配置 1.1 配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的IP地址 &#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [atguiguhadoop102 ~]$ ssh hadoop103&#xff08;3&#xff09;回退到 hadoop102 [at…

linux离线安装rdbtools,需先安装python

离线安装python3 下载python包&#xff0c;下载地址&#xff1a;https://www.python.org/ftp/python/ 我选的是https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz 将文件上传至linux服务器&#xff0c;解压 tar -xf Python-3.9.0.tgz cd Python-3.9.0 mkdir /usr/l…

SpringBoot v2.7.x+ 整合Swagger3入坑记?

目录 一、依赖 二、集成Swagger Java Config 三、配置完毕 四、解决方案 彩蛋 想尝鲜&#xff0c;坑也多&#xff0c;一起入个坑~ 一、依赖 SpringBoot版本&#xff1a;2.7.14 Swagger版本&#xff1a;3.0.0 <dependency><groupId>com.github.xiaoymin<…

Java面试之斐波那契数列(Fibonacci)及其应用:青蛙跳台阶问题

文章目录 一、斐波那契数列问题1.1 题目1.2 什么是斐波那契数列1.3 效率很低的解法&#xff1a;递归1.4 递归缺点分析 二、比较好的解决办法2.1 保存数列中间项2.2 从下往上计算 三、公式法四、青蛙跳台阶问题4.1 题目及分析4.2 代码实现 一、斐波那契数列问题 1.1 题目 写一…

制作鲜花商城小程序的详细步骤

如果你是一个新手商家&#xff0c;想要进入鲜花团购市场&#xff0c;但是不知道如何制作一个小程序商城&#xff0c;那么这篇文章就是为你准备的。以下是制作鲜花团购小程序商城的详细步骤&#xff1a; 1. 登录乔拓云平台后台&#xff0c;进入商城管理页面 首先&#xff0c;你需…

Shopee测评补单技巧:优化商品流量与权重

在Shopee平台上进行测评是一种低成本、高回报的推广方式&#xff0c;可以对商品的流量、转化率、质量分和权重等多个指标起到辅助作用。以下是一些Shopee测评的技巧和注意事项&#xff1a; 1. 测评原理与周期&#xff1a; Shopee的新品周期为7天&#xff0c;平台会在这段时间…