Spring Boot 整合 Redis

以下是 Spring Boot 整合 Redis 的指南,涵盖配置、基本操作、高级用法及常见问题解决。


1. 添加依赖

pom.xml 中添加 Spring Data Redis 和连接池依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 如果需要使用 Lettuce 连接池 -->
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId>
</dependency>

2. 配置 Redis

application.yml 中配置 Redis 连接信息:

spring:redis:host: localhostport: 6379password: your_password  # 无密码则留空database: 0timeout: 5000mslettuce:pool:max-active: 8max-idle: 8min-idle: 2max-wait: 1000ms

3. 配置 RedisTemplate(关键步骤)

默认的 RedisTemplate 使用 JDK 序列化,建议自定义为 JSON 序列化:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// Key 使用 String 序列化template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// Value 使用 JSON 序列化(支持复杂对象)template.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}

4. 基本操作示例

存储与读取数据
@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储字符串public void setString(String key, String value) {redisTemplate.opsForValue().set(key, value);}// 存储对象public void setObject(String key, Object obj) {redisTemplate.opsForValue().set(key, obj);}// 获取数据public Object get(String key) {return redisTemplate.opsForValue().get(key);}// 删除数据public Boolean delete(String key) {return redisTemplate.delete(key);}// 设置过期时间(秒)public Boolean expire(String key, long timeout) {return redisTemplate.expire(key, timeout, TimeUnit.SECONDS);}
}

5. 高级用法

5.1 事务管理
public void executeWithTransaction() {redisTemplate.multi(); // 开启事务try {redisTemplate.opsForValue().set("key1", "value1");redisTemplate.opsForList().leftPush("list", "item1");redisTemplate.exec(); // 提交事务} catch (Exception e) {redisTemplate.discard(); // 回滚事务}
}
5.2 发布/订阅(Pub/Sub)

订阅者:

@Component
public class RedisMessageListener implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String channel = new String(message.getChannel());String body = new String(message.getBody());System.out.println("Received: " + body + " from channel: " + channel);}
}

发布消息:

@Service
public class RedisPublisher {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void publish(String channel, String message) {redisTemplate.convertAndSend(channel, message);}
}
5.3 集成 Spring Cache

启用缓存:

@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

使用缓存注解:

@Service
public class UserService {@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {// 模拟数据库查询return new User(id, "Alice");}@CacheEvict(value = "users", key = "#id")public void deleteUser(Long id) {// 删除用户逻辑}
}

6. 处理常见问题

6.1 序列化问题
  • 现象:Redis 中存储的数据为乱码。
  • 解决方案:自定义 RedisTemplate 的序列化器(如上述 JSON 配置)。
6.2 连接池配置
  • 问题:连接数不足或泄漏。
  • 解决方案:根据业务调整 max-activemax-idle,确保合理释放连接。
6.3 Redis 集群配置

application.yml 中配置集群节点:

spring:redis:cluster:nodes: 192.168.1.101:6379,192.168.1.102:6379,192.168.1.103:6379lettuce:pool:max-active: 16

7. 完整代码示例

实体类
public class User {private Long id;private String name;// 省略构造函数、Getter/Setter
}
Controller 层
@RestController
@RequestMapping("/redis")
public class RedisController {@Autowiredprivate RedisService redisService;@GetMapping("/set")public String setValue(@RequestParam String key, @RequestParam String value) {redisService.setString(key, value);return "Set success";}@GetMapping("/get")public Object getValue(@RequestParam String key) {return redisService.get(key);}
}

8. 测试与验证

  1. 启动 Redis 服务。
  2. 运行 Spring Boot 应用。
  3. 使用 curl 或 Postman 测试接口:
    curl "http://localhost:8080/redis/set?key=name&value=Alice"
    curl "http://localhost:8080/redis/get?key=name"
    

总结

通过以上步骤,你可以实现:

  • 基础操作:字符串、对象的存储与读取。
  • 高级功能:事务、发布/订阅、缓存注解。
  • 优化配置:连接池、序列化、集群支持。

根据业务需求选择合适的 Redis 客户端(Lettuce/Jedis)和序列化方式,确保高性能与兼容性。

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

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

相关文章

AWS Bedrock 正式接入 DeepSeek-R1 模型:安全托管的生成式 AI 解决方案

亚马逊云科技&#xff08;AWS&#xff09;于 2024 年 1 月 30 日 宣布&#xff0c;DeepSeek-R1 模型 正式通过 Amazon Bedrock 平台提供服务&#xff0c;用户可通过 Bedrock Marketplace 或自定义模型导入功能使用该模型。 DeepSeek-R1&#xff0c;其安全防护机制与全面的 AI 部…

数据结构之线性表

目录 1 简介 2 线性表的基本概念 3 顺序存储的线性表 3.1 定义线性表结构 3.2 初始化线性表 3.3 插入元素 3.4 删除元素 3.5 查找元素 3.6 扩容操作 3.7 打印线性表 4 线性表的应用 5 总结 1 简介 线性表是数据结构中最基础且常用的一种结构&#xff0c;它是由一…

c#面试题12

1.ApplicationPool介绍一下 c#里没有 2.XML 可扩展标记语言&#xff0c;一般以.xml文件格式的形式存在。可用于存储结构化的数据 3.ASP.NET的用户控件 将原始的控件&#xff0c;用户根据需要进行整合成一个新的控件 4.介绍一下code-Behind 即代码后置技术&#xff0c;就是…

英语学习(GitHub学到的分享)

【英语语法&#xff1a;https://github.com/hzpt-inet-club/english-note】 【离谱的英语学习指南&#xff1a;https://github.com/byoungd/English-level-up-tips/tree/master】 【很喜欢文中的一句话&#xff1a;如果我轻轻松松的学习&#xff0c;生活的幸福指数会提高很多…

C++蓝桥杯基础篇(十一)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来学习C蓝桥杯基础篇&#xff08;十一&#xff09;&#xff0c;学习类&#xff0c;结构体&#xff0c;指针相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯~ 一、类与结构体 类的定义&#xff1a;在C中&#x…

一次解决Andriod Studio Build Gradle很慢或报错下载失败等问题

Andriod Studio创建项目时&#xff0c;Build gradle一直在下载或者卡住或者很慢&#xff0c;反正就是会在这里出现各自问题的&#xff0c;请看这里&#xff01; 来来来&#xff0c;全体目光向我看齐&#xff01;&#xff01;&#xff01;保准让你解决掉这个问题&#xff01;这…

接口自动化入门 —— swagger/word/excelpdf等不同种类的接口文档理解!

在接口自动化测试中&#xff0c;接口文档是开发和测试人员理解接口功能、参数和交互方式的重要依据。常见的接口文档类型包括Swagger、Word、Excel和PDF。 1. Swagger文档 Swagger是一种用于描述和定义RESTful API的规范&#xff0c;使用JSON或YAML格式来定义API的输入参数、输…

Docker Compose国内镜像一键部署dify

克隆代码 git clone https://github.com/langgenius/dify.git进入docker目录 cd docker修改.env部分 # 将环境模版文件变量重命名 cp .env.example .env # 修改 .env,修改nginx的host和端口,避免端口冲突 NGINX_SERVER_NAME192.168.1.223 NGINX_PORT1880 NGINX_SSL_PORT1443…

网络安全之文件上传漏洞

一&#xff0c;文件上传漏洞的原因&#xff1a; 文件上传漏洞的存在主要是因为开发者未对用户上传的文件进行充分的安全验证&#xff0c;导致攻击者可以上传恶意文件&#xff08;如 WebShell、恶意脚本等&#xff09;到服务器&#xff0c;进而控制服务器或实施进一步攻击。 常…

QT系列教程(20) Qt 项目视图便捷类

视频连接 https://www.bilibili.com/video/BV1XY41127t3/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 Qt项目视图便捷类 Qt项目视图提供了一些便捷类&#xff0c;包括QListWidget, QTableWidget&#xff0c; QTreeWidget等。我们分别介绍这几个便捷类。 我们先创建一个Qt …

Java学习--MySQL

后端开发中&#xff0c;数据常存储在数据库中&#xff1a; 一、数据库基础 数据库&#xff1a;DataBase&#xff08;DB&#xff09;&#xff0c;是存储和管理数据的仓库 1.1连接数据库 mysql -u用户 -p密码 [-h数据库服务器ip地址 -P端口号] 1.2 关系型数据库 关系型数据…

博客系统测试报告

一、项目背景 以SSM为框架实现的博客系统有四个功能&#xff0c;登录账号进入博客首页&#xff0c;首页展示发布的博客列表&#xff0c;还可以编写或者更改博客内容。为了确保博客系统在各种场景下都能正常运行&#xff0c;需要进行尽可能全面的功能测试和自动化测试。本项目旨…

Chebykan wx 文章阅读

文献筛选 [1] 神经网络&#xff1a;全面基础 [2] 通过sigmoid函数的超层叠近似 [3] 多层前馈网络是通用近似器 [5] 注意力是你所需要的 [6] 深度残差学习用于图像识别 [7] 视觉化神经网络的损失景观 [8] 牙齿模具点云补全通过数据增强和混合RL-GAN [9] 强化学习&#xff1a;一…

LabVIEW变频器谐波分析系统

随着工业自动化的发展&#xff0c;变频器在电力、机械等领域的应用日益广泛&#xff0c;但谐波问题直接影响系统效率与稳定性。传统谐波检测设备&#xff08;如Norma5000&#xff09;精度虽高&#xff0c;但价格昂贵且操作复杂&#xff0c;难以适应现场快速检测需求。本项目基于…

C语言每日一练——day_4

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第四天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…

理解字符流和字节流,节点流和处理流、缓冲流、InputStreamReader、BufferInputStream、BufferReader...

DAY10.2 Java核心基础 IO流 字符流和字节流 字符流和字节流在每次处理数据的单位不同&#xff0c;一个是字符&#xff0c;一个是字节 如果复制文件类型是文本类型&#xff0c;字节流字符流都可以 如果复制的文件类型是非文本类型&#xff0c;则只能使用字节流&#xff0c;使…

泄露测试仪CTS的Sentinel I28使用

前言:本文档主要讨论CTS Sentinel I28的使用方法,设备图片如下: 具体文档可从下面链接下载: https://download.csdn.net/download/qq_34047402/90471262 泄露测试仪CTS的SentinelI28使用资源-CSDN文库 [注意] 调压方式,若选择机械式调压,那么测试的压力值只能有1个,…

YOLOv11融合[CVPR205]SCSegamba中的GBC结构

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《SCSegamba: Lightweight Structure-Aware Vision Mamba for Crack Segmentation in Structures》 一、 模块介绍 论文链接&#xff1a;https://arxi…

C++蓝桥杯皮亚诺曲线距离求解

C蓝桥杯皮亚诺曲线距离求解 一、题目概述二、解题分析2.1解题思路2.2k值范围限制 三、实现代码四、代码测试4.1蓝桥杯测试平台4.2直接传入原始输入的k值4.3限制k值大小4.4pow函数求整数高次幂存在误差4.5满分代码 附录error: ‘long long int y1’ redeclared as different kin…

uni-app+vue3学习随笔

目录相关 static文件 编译器会把static目录中的内容整体复制到最终编译包内&#xff0c; 非 static 目录下的文件&#xff08;vue组件、js、css 等&#xff09;只有被引用时&#xff0c;才会被打包编译。 css、less/scss 等资源不要放在 static 目录下&#xff0c;建议这些…