当前位置: 首页 > news >正文

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩

1 穿透: 两边都不存在(皇帝的新装) (返回空值)(互斥锁)(黑名单) (布隆过滤器)

2 穿:一个或多个热点的key失效了,这时大量的并发请求直接到达数据库. (提前预热

3 雪崩:大量key同时失效 (避免大量的key同一时间失效,错峰

【大厂面试题】缓存穿透清晰讲解!看完不会,你来打我 # 编程 # java # java面试 # 面试题 # 开发 https://v.douyin.com/irdtam1Q/ 复制此链接,打开Dou音搜索,直接观看视频!

2.Spring是如何集成Redis的?

Spring Data Redis

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

3.高级封装

4.Redis配置

Spring.Redis常用配置参数有哪些。

# Redis服务器地址
spring.redis.host=10.1.30.222
# Redis数据库索引(默认为0)
spring.redis.database=0 
# Redis服务器连接端口
spring.redis.port=6379 
# Redis服务器连接密码(默认为空)
#spring.redis.password=
## 连接超时时间(毫秒)
spring.redis.timeout=30000
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=1
#连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
spring.redis.lettuce.pool.min-evictable-idle-time-millis = 3000
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1

5.StringRedisTemplate

String

@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final String key = "zhengzhou";public void test() {stringRedisTemplate.opsForValue().set(key, "我的家乡", 30, TimeUnit.SECONDS);String value = stringRedisTemplate.opsForValue().get(key);System.out.println(value);}

Hash

@Autowiredprivate StringRedisTemplate stringRedisTemplate;private  final  String key ="zhouxingxing";public void  test(){stringRedisTemplate.opsForHash().put(key,"20220325","郑州");stringRedisTemplate.opsForHash().put(key,"20220326","洛阳");List<Object> values = stringRedisTemplate.opsForHash().values(key);for (Object value:values){System.out.println(value);}}

List

@Autowiredprivate StringRedisTemplate stringRedisTemplate;private  final  String key ="onewayroad";void  test(){stringRedisTemplate.opsForList().leftPush(key,"周星星");stringRedisTemplate.opsForList().leftPush(key,"张敏");stringRedisTemplate.opsForList().leftPush(key,"李大锤");String value = stringRedisTemplate.opsForList().rightPop(key);System.out.println(value);}
}@Testvoid test6() {// 如果一些原生命令,spring 没有给我们封装,redisTemplate.execute(new RedisCallback)while (true){System.out.println("开始一轮监听");List<byte[]> rawResults = redisTemplateProduct.execute(new RedisCallback<List<byte[]>>() {@Overridepublic List<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {return connection.bRPop(5,"product.hot".getBytes());}});if(ObjUtil.isNotEmpty(rawResults)){byte[] rawKey = rawResults.get(0);byte[] rawValue = rawResults.get(1);Product product = (Product)redisTemplateProduct.getValueSerializer().deserialize(rawValue);System.out.println(product);}}

Set

@Component
public class SetDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final  String zhouxingxing ="zhouxingxing";private  final  String zhangmin = "zhangming";public void  test(){//添加周星星同学感兴趣的科目stringRedisTemplate.opsForSet().add(zhouxingxing,"语文");stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");//添加张敏同学感兴趣的科目stringRedisTemplate.opsForSet().add(zhangmin,"数学");stringRedisTemplate.opsForSet().add(zhangmin,"英语");//获取两位同学共同感兴趣的科目Set<String> values = stringRedisTemplate.opsForSet().intersect(zhouxingxing, zhangmin);System.out.println("周星星和张敏共同感兴趣的科目为:");for(String value : values){System.out.println(value);}}
}

ZSet

@Component
public class ZSetDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private final  String key ="zhouxingxing";public void  test(){//添加周星星同学成绩stringRedisTemplate.opsForZSet().add(key,"语文",98);stringRedisTemplate.opsForZSet().add(key,"数学",87);stringRedisTemplate.opsForZSet().add(key,"英语",75);//获取分数最高的成绩ZSetOperations.TypedTuple<String> values = stringRedisTemplate.opsForZSet().popMax(key);//打印值System.out.println("周星星最好成绩科目是:"+values.getValue());System.out.println("周星星最好成绩:"+values.getScore());}
}

6.RedisTemplate<T,V>泛型约束

6.1泛型约束的使用

@Component
public class RedisTemplateDemo {@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate RedisTemplate<String, User> redisTemplate;@Resource(name="redisTemplate")private ValueOperations<String,User> valueOperations;private final String key = "useris#01";public void test() {User user = User.builder().id(1).name("李四").build();redisTemplate.opsForValue().set(key,user );User value = redisTemplate.opsForValue().get(key);valueOperations.set(key,user );User value2 = valueOperations.get(key);System.out.println(value);}
}

6.2乱码的问题

        JdkSerializationRedisSerializer  serializer = new JdkSerializationRedisSerializer();byte[] serialize = serializer.serialize("user.01");System.out.println(new String(serialize));

6.3自定义序列化工具

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 序列化的时候,自动推断类型,将类型信息作为属性写入JSON// 反序列化时候,根据类型的全类名,序列化成对应的对象实例objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);//普通key序列化工具template.setKeySerializer(RedisSerializer.string());template.setValueSerializer(jackson2JsonRedisSerializer);//hash 小key 序列化工具template.setHashKeySerializer(RedisSerializer.string());template.setHashValueSerializer(jackson2JsonRedisSerializer);return template;}}

7. 直接使用ListOperations、ValueOperations、SetOperations、ZSetOperations、HashOperations接口

在Spring Data Redis中,提供了丰富的模板操作接口,

ListOperationsValueOperationsSetOperationsZSetOperationsHashOperations

这些都是RedisTemplate的子接口,用于针对不同类型的Redis数据结构进行操作

REDIS 注释 redistemplate注入_mob6454cc6f4a4e的技术博客_51CTO博客

相关文章:

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩 1 穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;返回空值&#xff09;&#xff08;互斥锁&#xff09;&#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 2 击穿&#xff1a;一个或多个热…...

pve 命令开启关闭虚拟机

命令 #查看集群资源状况 #pvesh get /cluster/resources #取得虚拟机当前状态 #pvesh get /nodes/<节点id>/qemu/<虚拟机id>/status/current #pvesh get /nodes/www/qemu/107/status/current#关闭虚拟机 #pvesh create /nodes/<节点id>/qemu/<虚拟机id&…...

【达梦数据库】临时表的使用测试

目录 背景问题复现问题原因解决方法 背景 用户在使用临时表的过程中&#xff0c;执行commit提交命令之后&#xff0c;临时表的数据被清空&#xff0c;无法被接下来的存储过程复用。 问题复现 -----------------------------提交删除行----------------------------- --创建临…...

【GUI设计】基于Matlab的图像去噪GUI系统(8),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像去噪GUI系统&am…...

【计算机科学导论】

计算机科学的本质就是解决问题&#xff0c;我们计算机由输入设备&#xff0c;处理设备和输出设备组成。 处理设备看做一个大黑盒&#xff0c;目的就是接收处理数据&#xff0c;然后发送到输出设备。计算机中存储数据就是2进制&#xff0c;0和1&#xff0c;0代表关&#xff0c;…...

【C++】I/O流的使用介绍

文章目录 什么是 I/O 流&#xff1f;C I/O 流的基本类型常用的 I/O 操作1. 标准输入输出2. 文件输入输出3. 字符串流 什么是 I/O 流&#xff1f; 在 C 中&#xff0c;I/O 流是数据的输入和输出通道。流的本质是一个字节序列&#xff0c;提供了抽象的方式来读写数据。C 使用流对…...

深度学习:(八)深层神经网络参数与流程

深层神经网络 符号规定 L L L &#xff1a;表示神经网络的层数&#xff1b; l l l &#xff1a;表示第几层&#xff1b; n [ l ] n^{[~l~]} n[ l ] &#xff1a;表示第 l l l 层的节点数&#xff1b; a [ l ] a^{[~l~]} a[ l ] &#xff1a;表示第 l l l 层中的激活函数&…...

`pattern = r“(\d+)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)“

pattern r"(\d)(CNY|JPY|HKD|EUR|GBP|fen|cents|sen|eurocents|pence)" 是一个正则表达式&#xff0c;用于匹配特定格式的字符串。 正则表达式解析 整体结构&#xff1a; r"..."&#xff1a;前缀 r 表示这是一个原始字符串&#xff08;Raw String&#x…...

宝塔面板部署雷池社区版教程

宝塔面板部署雷池社区版教程 简单介绍一下宝塔面板&#xff0c;安全高效的服务器运维面板&#xff0c;使用宝塔面板的人非常多 在网站管理上&#xff0c;许多用户都是通过宝塔面板进行管理&#xff0c;宝塔面板的Nginx默认监听端口为80和443&#xff0c;这就导致共存部署时雷池…...

【击败100%】258. 各位相加

首次出现&#xff0c;代码用时击败了100%的用户&#xff0c;开心~ 题目 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。返回这个结果。 示例 1: 输入: num 38 输出: 2 解释: 各位相加的过程为&#xff1a; 38 --> 3 8 -->…...

【alist】宝塔面板docker里的alist默认admin无法登录

宝塔docker安装完alist&#xff0c;根据页面的提示账号密码死活登录不上&#xff0c;提示密码有问题 页面提示&#xff1a; 数据存储目录 /www/dk_project/dk_app/dk_alist 使用说明请参考&#xff1a; >使用教程 默认账号密码&#xff08;admin/admin) 首次登录后点击个人…...

【击败100%】1281. 整数的各位积和之差

击败了100%的用户&#xff0c;开心~ 题目 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1&#xff1a; 输入&#xff1a;n 234 输出&#xff1a;15 解释&#xff1a; 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 …...

Flink基本概念和算子使用

基础概念 Flink是一个框架和分布式处理引擎&#xff0c;用于对无界数据流和有界数据流进行有状态计算&#xff0c;它的核心目标是“数据流上的有状态计算”。 有界流和无界流 有界流&#xff1a;具有明确的开始和结束时间&#xff0c;数据量有限。适合使用批处理技术&#xf…...

Kafka 3.0.0集群部署教程

1、集群规划 主机名 ip地址 node.id process.roles kafka1 192.168.0.29 1 broker,controller Kafka2 192.168.0.30 2 broker,controller Kafka3 192.168.0.31 3 broker,controller 2、将kafka包上传以上节点/app目录下 mkdir /app 3、解压kafka包 所有节点 …...

昇思MindSpore进阶教程-格式转换

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 MindSpore中可以把用于训练网络模型的数据…...

搜索软件 Everything 的安装与使用教程

一、Everything简介 适用于 Windows 的免费搜索工具 Everything 是 Windows 的即时搜索引擎。发现、整理并轻松访问文件和文件夹&#xff0c;一切尽在指尖&#xff01; PS&#xff1a;Everything无法对文件内容进行搜索&#xff0c;只能根据文件名和路径进行搜索 二、Everyt…...

oracle 如何判断当前时间在27号到当月月底

在Oracle中&#xff0c;您可以使用TRUNC和LAST_DAY函数来判断当前时间是否在27号到当月月底之间。以下是一个SQL示例&#xff1a; SELECT CASE WHEN TRUNC(SYSDATE) > TRUNC(SYSDATE, DD) 26 AND TRUNC(SYSDATE) < LAST_DAY(SYSDATE) THEN 当前时间在27号到当月月底之间…...

Django 配置邮箱服务,实现发送信息到指定邮箱

一、这里以qq邮箱为例&#xff0c;打开qq邮箱的SMTP服务 二、django项目目录设置setting.py 文件 setting.py 添加如下内容&#xff1a; # 发送邮件相关配置 EMAIL_BACKEND django.core.mail.backends.smtp.EmailBackend EMAIL_USE_TLS True EMAIL_HOST smtp.qq.com EMAIL…...

Git使用手册

1、初识Git 概述&#xff1a;Git 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理项目版本管理。 知识点补充&#xff1a; 版本控制&#xff1a;一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 分布式&#xff1a;每个人…...

sql-labs靶场

第一关&#xff08;get传参&#xff0c;单引号闭合&#xff0c;有回显&#xff0c;无过滤&#xff09; ?id-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity) -- 第二关&#xff08;get传参&#xff0c;无闭…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...