SpringBoot集成Redis是我们常见的功能,今天我们分享一下:

前言:

1、pom包引用

<!-- Redis Starter (默认使用 Lettuce) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Jackson 序列化支持 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.3</version> <!-- Spring Boot 2.3.4 内置版本 --></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.9.0</version> <!-- 兼容2.3.4的版本 --></dependency><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.8.RELEASE</version></parent>

2、配置文件信息

# Redis 基础配置
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.database=0# 连接池配置 明确使用commons-pool2连接池
spring.redis.lettuce.pool.enabled=true
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
spring.redis.timeout=5000ms# 全局缓存过期时间 (单位: 秒)
spring.cache.redis.time-to-live=180

3、服务配置类

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;@Configuration
@EnableCaching // 启用缓存注解
public class RedisConfig {/*** 自定义 RedisTemplate (解决乱码问题)*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// Key 使用 String 序列化template.setKeySerializer(new StringRedisSerializer());// Value 使用 JSON 序列化template.setValueSerializer(new GenericJackson2JsonRedisSerializer());// Hash Value 使用 JSON 序列化template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());template.afterPropertiesSet();return template;}/*** 设置全局缓存过期时间 (3分钟)*/@Beanpublic RedisCacheConfiguration cacheConfiguration() {return RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(3)) // 设置缓存默认过期时间.disableCachingNullValues()      // 不缓存 null 值.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));}
}

4、业务伪代码

@Autowired
private RedisTemplate<String, Object> redisTemplate;@Autowired
private ObjectMapper objectMapper;

1)保存并获取字符串

       redisTemplate.opsForValue().set("token", "123qaz", 3, TimeUnit.MINUTES);String json = (String) redisTemplate.opsForValue().get("token");

2)保存并获取对象

       String key = "user:" + user.getId();// 方法1:使用 RedisTemplate 自动序列化redisTemplate.opsForValue().set(key, user, 3, TimeUnit.MINUTES);// 方法1:直接获取对象 (自动反序列化)User user120 = (User) redisTemplate.opsForValue().get(key1);// 方法2:获取JSON字符串并转换/*String json = (String) redisTemplate.opsForValue().get(key);if(json != null) {return objectMapper.readValue(json, User.class);}*/

3)保存并获取集合

        List<User> userList = new ArrayList<>();User user = new User();user.setArea("北京");user.setBsnm("北京站");user.setId(10);User user1 = new User();user1.setArea("昌平");user1.setBsnm("龙珠站");user1.setId(9);userList.add(user1);userList.add(user);String key12 = "user:" + user.getId()+":"+user1.getId();redisTemplate.opsForValue().set(key12, userList, 3, TimeUnit.MINUTES);//强制获取List<User> user12List = (List<User>) redisTemplate.opsForValue().get(key12);//标准安全获取/*** 从缓存获取用户列表*/public List<User> getUserListFromCache(String key) {try {// 1. 从Redis获取数据Object cachedData = redisTemplate.opsForValue().get(key);if (cachedData == null) {return Collections.emptyList(); // 缓存不存在}// 2. 类型安全转换if (cachedData instanceof List) {// 3. 直接转换(当序列化配置正确时可用)return (List<User>) cachedData;} else if (cachedData instanceof String) {// 4. 处理JSON字符串形式的数据return objectMapper.readValue((String) cachedData,new TypeReference<List<User>>() {});}// 5. 其他类型处理return objectMapper.convertValue(cachedData,new TypeReference<List<User>>() {});} catch (Exception e) {// 6. 异常处理(记录日志等)e.printStackTrace();return Collections.emptyList();}}

4)多个key获取数据

    /*** 获取实体对象集合*/public List<User> getUsers(List<String> userIds) {List<String> keys = userIds.stream().map(id -> "user:" + id).collect(Collectors.toList());// 批量获取List<Object> results = redisTemplate.opsForValue().multiGet(keys);return results.stream().filter(Objects::nonNull).map(obj -> (User) obj) // 自动反序列化.collect(Collectors.toList());}

5)使用注解获取缓存

     /*** 自动缓存结果 (使用全局3分钟过期)*/@Cacheable(value = "products", key = "#id")public Product getProductById(Long id) {// 模拟数据库查询return productRepository.findById(id).orElse(null);}/*** 自定义缓存过期时间 (覆盖全局设置)*/@Cacheable(value = "hot_products", key = "#id", cacheManager = "customCacheManager")public Product getHotProduct(Long id) {// ...}// 在 RedisConfig 中添加@Beanpublic RedisCacheManager customCacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)) // 自定义5分钟.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));return RedisCacheManager.builder(factory).cacheDefaults(config).build();}

 

5、

6、

7、

8、

到此,SpringBoot集成Redis分享完成,下篇我们分享器源码相关,敬请期待。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper Curator(3):Watch事件监听

文章目录 Curator API 常用操作 Watch事件监听NodeCachePathChildrenCacheTreeCache 本章代码已分享至Gitee: https://gitee.com/lengcz/curator01 Curator API 常用操作 Watch事件监听 zookeeper 允许用户在指定节点上注册一些Watcher &#xff0c;并且在一些特定事件触发的时…

多模态融合相机L3CAM

多模态融合相机L3CAM L3CAM是Beamagine公司推出的多模态传感器融合技术&#xff0c;结合了激光雷达&#xff08;LiDAR&#xff09;和可见光摄像头&#xff0c;旨在为自动驾驶、工业机器人和其他需要精确环境感知的应用场景提供高效、安全的解决方案。 L3CAM技术参数 L3CAM结合…

结构化思维

前言 洞悉分析方法论 系统解决管理问题 1 构建问题分析框架 1.1 摘要 &#xff08;1&#xff09;何谓问题分析和解决&#xff1f; &#xff08;2&#xff09;问题分析和解决的基本原则 1.2 什么是问题分析与决策&#xff1f; 1.3 问题解决者需要具备的四种能力 &#xf…

什么是数字签名(ECDSA)?

数字签名是区块链、数字身份认证和安全通信的核心技术之一&#xff0c;ECDSA&#xff08;椭圆曲线数字签名算法&#xff09;是目前最常见、最主流的数字签名算法之一&#xff0c;尤其在区块链系统&#xff08;如比特币、以太坊、EOS&#xff09;中广泛应用。 一、什么是数字签名…

深入剖析AI大模型:Dify的介绍

今天介绍的内容&#xff0c;跟大模型开发还是息息相关的。俗话说&#xff1a;有人的地方就是江湖&#xff01;对于我们技术其实也一样&#xff0c;一个新技术的出现&#xff0c;自然会衍生出相应的生态圈。今天的文字只是介绍&#xff0c;以后会有专门的实操篇&#xff0c;主要…

Open VSX Registry关键漏洞使攻击者可完全控制Visual Studio Code扩展市场

网络安全研究人员近日披露了 Open VSX Registry&#xff08;"open-vsx[.]org"&#xff09;中存在的一个关键漏洞。若被成功利用&#xff0c;攻击者可能完全控制整个 Visual Studio Code 扩展市场&#xff0c;造成严重的供应链风险。 漏洞详情与潜在影响 Koi Securi…

Python从入门到高手9.1节-Python中的字典类型

目录 9.1.1 理解字典类型 9.1.2 字典的类型名 9.1.3 字典的定义 9.1.4 字典的主要性质 9.1.5 好好学习&#xff0c;天天向上 9.1.1 理解字典类型 在日常生活中&#xff0c;我们常常会接触到“字典”这种数据类型&#xff0c;例如一本书籍的目录结构&#xff0c;在目录结构…

封禁UDP端口提高防御能力分析

封禁不必要的 UDP 端口 确实可以在一定程度上提高系统的防御力&#xff0c;但这并不是一个绝对的“好”或“坏”的问题&#xff0c;需要根据具体情况来判断。以下是详细分析&#xff1a; ✅ 封禁 UDP 端口能提高防御力的原因 (优点) 减少攻击面&#xff1a; 服务暴露&#xff…

阿里云-arms监控

监控java应用 若是容器集群环境&#xff0c;则选择容器服务环境 手动安装方式&#xff0c;是手动把 agent的jar包放到 ecs服务器&#xff0c;然后运行个人的spring boot服务时&#xff0c;加上一些参数&#xff0c;将agent也启动运行 手动集成-添加agent 监控的是ecs中的java应…

c语言 char *str = ““ 和 char *str = NULL 以及 char str[] = {} 区别

目录 前言char *str "" 和 char *str NULL 区别char *str NULL 和 char str[] {} 区别char *str "" 和 char str[] {} 区别char *str "" 和 const char *str "" 区别 前言 C语言指针的使用非常常见且易出错&#xff0c;这里对…

小程序入门: tab bar 实现多页面快速切换效果

在小程序开发中&#xff0c;tab bar 是实现多页面快速切换的关键组件&#xff0c;能极大提升用户体验。上一篇我们完成了基础配置&#xff0c;今天深入探索&#xff0c;打造更丰富实用的 tab bar 效果。 实现目标 这次要在小程序底部创建包含 “首页”“消息”“联系我们” 三…

Python 数据分析:numpy,抽提,多维切片索引

目录 1 示例代码2 欢迎纠错3 免费爬虫------以下关于 Markdown 编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个…

【向上教育】结构化面试概述.pdf

目 录 第一章 面试须知—面试形式 .......................................................................................................... 1 一、结构化面试 .................................................................................................…

STM32F407控制单个张大头闭环步进电机讲解与梯形加减速(HAL库)

文章目录 硬件连接CubeMX配置**使用TIM5定时器CH3,即PA2作为脉冲控制&#xff0c;PE5控制方向&#xff08;TIM5_CH4是为控制双电机做准备的可以先不配置&#xff09;** 设置占空比为50%,以下为AI讲解重要&#xff01;&#xff01;&#xff01;定时器更新中断脉冲触发原理详解PW…

MongoDB入门学习(含JAVA客户端)

0.序章 致命的面试问题&#xff1a;为什么使用MongoDB&#xff1f; 大型的分布式的文档型数据库&#xff0c;也是NoSQL数据库&#xff08;例如 redis&#xff09; MongoDB适合数据量大而价值又低的这种数据&#xff08;播放进度、评论、弹幕&#xff0c;实时数据的CRUD&…

RedisCache与StringRedisTemplate的深度对比

1. 基本概念 RedisCache ​​定位​​&#xff1a;自定义封装的Redis缓存工具类​​特点​​&#xff1a;通常针对业务场景进行了高层抽象​​典型功能​​&#xff1a; 带过期时间的缓存操作自定义序列化方式业务键前缀管理简化常用操作API StringRedisTemplate ​​定位…

HOOPS Visualize技术详解(二):3D图形系统HOOPS/3DGS的段结构与属性机制

在工业级三维可视化领域中&#xff0c;HOOPS Visualize凭借其高性能和模块化设计被广泛应用于CAD、CAM、仿真、BIM等工程软件中。其中&#xff0c;HOOPS 3D Graphics System&#xff08;简称HOOPS/3DGS&#xff09;是HOOPS Visualize的核心组件&#xff0c;承担着图形场景管理、…

随机化在临床试验中的应用与挑战

一、随机化的核心目的 1.1 控制混杂偏倚 1.1.1 平衡预后因素 确保已知/未知预后因素在组间分布均衡,避免基线不平衡影响结果。 1.1.2 避免选择偏倚 防止研究者或患者主观选择分组,保障组间差异归因于干预。 1.2 保障统计推断有效性 1.2.1 满足独立性假设 满足统计检验…

在C++中#pragma“可选预处理指令的作用“。

文章目录 1. 标准定位&#xff1a;2. 语法形式&#xff1a;3. 常见用途举例4. 为什么用 #pragma&#xff1f;5. 宏里用 __pragma / _Pragma6. 常见误区 在 C/C 里&#xff0c;#pragma 本质上是“可选预处理器指令”&#xff0c;用来告诉编译器在编译某段代码时启用或关闭某些特…

windows系统中docker数据迁移出系统盘

1、关闭docker 2、移动docker数据 找到docker数据目录&#xff0c;一般在C:\Users\61050\AppData\Local\Docker文件&#xff0c;将整个docker目录复制到其他盘&#xff08;例如 D:\Docker&#xff09;&#xff0c;为保证不出错&#xff0c;可以先提前复制一份。 3、创建符号链…