Spring Boot 整合 Redis 实战
一、整合准备:环境与依赖
1. 技术栈说明
- Spring Boot 版本:3.1.2(兼容 Java 17+)
- Redis 服务器:Redis 7.0+(本地部署或 Docker 容器)
- Maven 依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId> </dependency> <!-- 可选: Lettuce连接池(默认)或Jedis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> <!-- 缓存注解支持 --> </dependency>
2. 启动 Redis 服务
- 本地启动:下载 Redis 安装包,执行redis-server
- Docker 启动:
docker run -d --name redis-server -p 6379:6379 redis:7.0-alpine
二、基础整合:配置与核心组件
1. 基础配置(application.yml)
spring:redis:host: localhost # Redis服务器地址port: 6379 # 端口password: "" # 密码(无密码则留空)database: 0 # 使用的数据库(0-15)lettuce:pool:max-active: 8 # 连接池最大连接数(使用负值表示没有限制)max-idle: 8 # 连接池最大空闲连接min-idle: 0 # 连接池最小空闲连接timeout: 3000ms # 连接超时时间(毫秒)
2. RedisTemplate 配置(自定义序列化)
默认的 JDK 序列化会生成二进制数据,可读性差且效率低,推荐使用 JSON 序列化:
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 配置Key序列化(String)template.setKeySerializer(new StringRedisSerializer());// 配置Value序列化(JSON)Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);template.setValueSerializer(jsonSerializer);// 哈希键和值序列化template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(jsonSerializer);return template;}
}
三、实战案例:核心功能实现
案例 1:简单缓存操作(CRUD)
1. 实体类(示例:用户信息)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String username;private Integer age;
}
2. 服务层(使用 RedisTemplate)
@Service
public class UserService {private final RedisTemplate<String, Object> redisTemplate;public UserService(RedisTemplate<String, Object> redisTemplate) {this.redisTemplate = redisTemplate;}// 存储数据(带过期时间)public void saveUser(Long userId, User user, long timeout, TimeUnit unit) {String key = "user:" + userId;redisTemplate.opsForValue().set(key, user, timeout, unit);}// 获取数据public User getUser(Long userId) {String key = "user:" + userId;return (User) redisTemplate.opsForValue().get(key);}// 删除数据public void deleteUser(Long userId) {String key = "user:" + userId;redisTemplate.delete(key);}
}
3. 控制器层
@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService = userService;}@PostMapping("/{userId}")public void saveUser(@PathVariable Long userId) {User user = new User(userId, "john_doe", 30);userService.saveUser(userId, user, 60, TimeUnit.SECONDS);}@GetMapping("/{userId}")public User getUser(@PathVariable Long userId) {return userService.getUser(userId);}
}
案例 2:使用 Spring Cache 注解简化开发
1. 启用缓存(主类添加注解)
@SpringBootApplication
@EnableCaching // 开启缓存支持
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
2. 服务层(注解驱动)
@Service
public class CacheService {// 缓存方法结果(key自动生成:方法参数+类名+方法名)@Cacheable(value = "products", key = "#productId") public Product getProduct(Long productId) {// 模拟数据库查询return databaseQuery(productId); }// 缓存更新(先更新数据库,再更新缓存)@CachePut(value = "products", key = "#product.id") public Product updateProduct(Product product) {// 更新数据库return databaseUpdate(product);}// 缓存删除(删除指定key的缓存)@CacheEvict(value = "products", key = "#productId") public void deleteProduct(Long productId) {databaseDelete(productId);}
}
案例 3:分布式锁(解决并发问题)
1. 使用 Redisson 实现分布式锁(添加依赖)
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.21.0</version>
</dependency>
2. 配置 Redisson 客户端(application.yml)
spring:redisson:singleServerConfig:address: "redis://localhost:6379"password: ""
3. 服务层(分布式锁示例)
@Service
public class OrderService {private final RedissonClient redissonClient;public OrderService(RedissonClient redissonClient) {this.redissonClient = redissonClient;}public void createOrder(String orderId) {RLock lock = redissonClient.getLock("order_lock:" + orderId);try {// 加锁(默认30秒自动续租)lock.lock(); // 执行业务逻辑(如扣减库存)deductStock(orderId);} finally {lock.unlock(); // 释放锁}}
}
四、高级用法:分布式会话与性能优化
1. 分布式会话管理(Spring Session + Redis)
(1)添加依赖
<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>
2)配置application.yml
spring:session:store-type: redis # 使用Redis存储会话redis:namespace: session # 会话数据命名空间
(3)效果
- 自动将会话数据存储到 Redis,解决分布式系统中 Session 共享问题
- 支持会话失效时间配置、集群环境下的无缝切换
2. 性能优化技巧
(1)连接池调优
spring:redis:lettuce:pool:max-active: 20 # 根据并发量调整,建议不超过Redis实例的最大连接数(默认10000)max-wait: 100ms # 连接获取最大等待时间
(2)Pipeline 批量操作
List<Object> results = redisTemplate.executePipelined(connection -> {for (Long userId : userIds) {connection.get("user:" + userId.getBytes());}return null;}
);
(3)淘汰策略配置
在 Redis 服务器端配置redis.conf,常用策略:
- allkeys-lru:当内存不足时,淘汰最近最少使用的键(推荐缓存场景)
- volatile-ttl:淘汰剩余过期时间最短的键
五、注意事项与最佳实践
1. 数据持久化
- 启用 RDB 或 AOF 持久化,避免内存数据丢失
- 生产环境建议同时开启 RDB(快照)和 AOF(日志)
2. 缓存穿透与雪崩
- 穿透:使用布隆过滤器(Bloom Filter)过滤无效 key
- 雪崩:设置随机过期时间、启用 Redis 集群主从复制
3. 序列化选择
- 优先使用 JSON 序列化(Jackson/JSONB),避免 JDK 序列化的性能损耗
- 二进制数据可直接使用RedisSerializer<byte[]>
4. 监控与运维
- 监控 Redis 内存使用率(used_memory)、连接数(client_list)
- 使用 Spring Boot Admin 或 Prometheus+Grafana 监控 Redis 性能指标
六、总结
通过 Spring Boot 与 Redis 的整合,我们可以轻松实现高性能缓存、分布式锁、会话共享等关键功能,显著提升系统的并发处理能力和用户体验。实际项目中,需根据场景选择合适的技术方案:
- 简单缓存:直接使用RedisTemplate或 Cache 注解
- 分布式场景:Redisson 实现分布式锁,Spring Session 管理会话
- 高可用:搭建 Redis 集群(主从 + 哨兵 / Cluster 模式)
相关文章:
Spring Boot 整合 Redis 实战
一、整合准备:环境与依赖 1. 技术栈说明 Spring Boot 版本:3.1.2(兼容 Java 17) Redis 服务器:Redis 7.0(本地部署或 Docker 容器) Maven 依赖: <dependency><…...
Spring事务失效的全面剖析
文章目录 1. Spring事务基础1.1 什么是Spring事务1.2 Spring事务的实现原理1.3 `@Transactional`注解的主要属性1.4 使用Spring事务的简单示例2. Spring事务失效的常见场景及解决方案2.1 方法不是public的问题描述问题示例解决方案技术原理解释2.2 自调用问题(同一个类中的方法…...
Pytorch张量和损失函数
文章目录 张量张量类型张量例子使用概率分布创建张量正态分布创建张量 (torch.normal)正态分布创建张量示例标准正态分布创建张量标准正态分布创建张量示例均匀分布创建张量均匀分布创建张量示例 激活函数常见激活函数 损失函数(Pytorch API)L1范数损失函数均方误差损失函数交叉…...
消息~组件(群聊类型)ConcurrentHashMap发送
为什么选择ConcurrentHashMap? 在开发聊天应用时,我们需要存储和管理大量的聊天消息数据,这些数据会被多个线程频繁访问和修改。比如,当多个用户同时发送消息时,服务端需要同时处理这些消息的存储和查询。如果用普通的…...

FFmpeg多路节目流复用为一路包含多个节目的输出流
在音视频处理领域,将多个独立的节目流(如不同频道的音视频内容)合并为一个包含多个节目的输出流是常见需求。FFmpeg 作为功能强大的多媒体处理工具,提供了灵活的流复用能力,本文将通过具体案例解析如何使用 FFmpeg 实现…...

分子动力学模拟揭示点突变对 hCFTR NBD1结构域热稳定性的影响
囊性纤维化(CF) 作为一种严重的常染色体隐性遗传疾病,全球约有 10 万名患者深受其害。它会累及人体多个器官,如肺部、胰腺等,严重影响患者的生活质量和寿命。CF 的 “罪魁祸首” 是 CFTR 氯离子通道的突变,…...

关于SIS/DCS点检周期
在中国化工行业,近几年在设备维护上有个挺有意思的现象,即SIS和DCS这两个系统的点检周期问题,隔三差五就被管理层会议讨论,可以说是企业管理层关注的重要方向与关心要素。 与一般工业行业中设备运维不同,SIS与DCS的点…...
python-pyqt6框架工具开发总结
菜单栏 工具栏 状态栏 QTreeView 用于展示树形结构数据(模-视图框架),文件系统,组织结构 通常与QAbstractItemModel的子类(如QStandardItemModel或自动义模型) 展开/折叠 控制节点的显示状态,展开时显示子节点,折叠时隐藏子节点 s…...
Docker Volumes
Docker Volumes 是 Docker 提供的一种机制,用于持久化存储容器数据。与容器的生命周期不同,Volumes 可以独立存在,即使容器被删除,数据仍然保留。以下是关于 Docker Volumes 的详细说明: 1. 为什么需要 Volumes&#…...

【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
1 限流的重要性 在高并发系统中,保护系统稳定运行的关键技术有缓存、降级和限流。 缓存通过在内存中存储常用数据,减少对数据库的访问,提升系统响应速度,如浏览器缓存、CDN缓存等多种应用层面。降级则是在系统压力过大或部分服务…...
FPGA实战项目2———多协议通信控制器
1. 多协议通信控制器模块 (multi_protocol_controller) 简要介绍 这是整个设计的顶层模块,承担着整合各个子模块的重要任务,是整个系统的核心枢纽。它负责协调 UART、SPI、I2C 等不同通信协议模块以及 DMA 模块的工作,同时处理不同时钟域之间的信号交互,确保各个模块能够…...

CST软件仿真案例——太阳能薄膜频谱吸收率
CST软件中的太阳能薄膜的功率吸收可用光频电磁波在介质材料中的损耗来计算。本案例计算非晶硅的功率吸收,然后考虑真实太阳频谱,计算有效吸收频谱。 用太阳能单元模板,时域求解器: 材料库提取四个材料,非晶硅…...
多线程进阶核心知识详解(通俗版)
Java多线程进阶详解 一、锁策略:如何高效管理资源竞争 在多线程环境中,锁是协调资源访问的核心机制。不同的锁策略适用于不同的场景,理解它们的差异能帮助优化程序性能。 1. 乐观锁 vs 悲观锁 悲观锁: 核心思想:假设…...
大模型中的KV Cache
1. KV Cache的定义与核心原理 KV Cache(Key-Value Cache)是一种在Transformer架构的大模型推理阶段使用的优化技术,通过缓存自注意力机制中的键(Key)和值(Value)矩阵,避免重复计算&…...
FHQ平衡树
FHQ平衡树 大致是这样的题目: 您需要动态地维护一个可重集合 M M M,并且提供以下操作: 向 M M M 中插入一个数 x x x。从 M M M 中删除一个数 x x x(若有多个相同的数,应只删除一个)。查询 M M M 中…...
力扣算法---总结篇
5.13 数组总结 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标对应的数据。 正是因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。 数组的元素是不…...

ABAP+旧数据接管的会计年度未确定
导资产主数据时,报错旧数据接管的会计年度未确定 是因为程序里面使用了下列函数AISCO_CALCULATE_FIRST_DAY,输入公司代码,获取会计年度,这个数据是在后台表T093C表中取数的,通过SE16N可以看到后台表数据没有数…...
Java【10_1】用户注册登录(面向过程与面向对象)
测试题 1、基于文本界面实现登录注册的需求(要求可以满足多个用户的注册和登录) 通过工具去完成 公共类: public class User { private int id;//用户编号 private int username;//用户名 private int password;//密码 private String name;//真…...

养生:打造健康生活的全方位策略
在生活节奏不断加快的当下,养生已成为提升生活质量、维护身心平衡的重要方式。从饮食、运动到睡眠,再到心态调节,各个方面的养生之道共同构建起健康生活的坚实基础。以下为您详细介绍养生的关键要点,助您拥抱健康生活。 饮食养生…...

贪吃蛇游戏排行榜模块开发总结:从数据到视觉的实现
一、项目背景与成果概览 在完成贪吃蛇游戏核心玩法后,本次开发重点聚焦于排行榜系统的实现。该系统具备以下核心特性: 🌐 双数据源支持:本地存储(localStorage)与远程API自由切换 🕒 时间维度统计:日榜/周榜/月榜/全时段数据筛选 🎮 模式区分:闯关模式(关卡进度…...
pytorch 数据预处理和常用工具
文章目录 NumPyNumpy数据结构安装和使用NumPy Matplotlib的安装和导入安装和导入Matplotlib绘制基础图画折线图散点图柱状图图例 数据清洗据清洗的作用Pandas进行数据清洗Pandas数据结构Series 数据结构DataFrame数据结构 Pandas数据清洗常用代码 特征工程主成分分析线性判别分…...
如何界定合法收集数据?
首席数据官高鹏律师团队 在当今数字化时代,数据的价值日益凸显,而合法收集数据成为了企业、机构以及各类组织必须严守的关键准则。作为律师,深入理解并准确界定合法收集数据的范畴,对于保障各方权益、维护法律秩序至关重要。 一…...
企业对数据集成工具的需求及 ETL 工具工作原理详解
当下,数据已然成为企业运营发展过程中的关键生产要素,其重要性不言而喻。 海量的数据分散在企业的各类系统、平台以及不同的业务部门之中,企业要充分挖掘这些数据背后所蕴含的巨大价值,实现数据驱动的精准决策,数据集…...
内核深入学习3——分析ARM32和ARM64体系架构下的Linux内存区域示意图与页表的建立流程
内核深入学习3——ARM32/ARM64在Linux内核中的实现(2) 今天我们来讨论的是一个硬核的内容,也是一个老生常谈的话题——那就是分析ARM32和ARM64体系架构下的Linux内存区域示意图的内容。对于ARM64的部分,我们早就知道一个基本的…...
MapReduce基本介绍
核心思想 分而治之:将大规模的数据处理任务分解成多个可以并行处理的子任务,然后将这些子任务分配到不同的计算节点上进行处理,最后将各个子任务的处理结果合并起来,得到最终的结果。 工作流程 Map 阶段: 输入数据被…...

屏幕与触摸调试
本章配套视频介绍: 《28-屏幕与触摸设置》 【鲁班猫】28-屏幕与触摸设置_哔哩哔哩_bilibili LubanCat-RK3588系列板卡都支持mipi屏以及hdmi显示屏的显示。 19.1. 旋转触摸屏 参考文章 触摸校准 参考文章 旋转触摸方向 配置触摸旋转方向 1 2 # 1.查看触摸输入设备 xinput…...

使用 百度云大模型平台 做 【提示词优化】
1. 百度云大模型平台 百度智能云千帆大模型平台  平台功能:演示了阿里云大模型的百炼平台,该平台提供Prompt工程功能,支持在线创建和优化Prompt模板模板类型:平台提供多种预制模板,同时也支持用户自定义…...
C 语言_常见排序算法全解析
排序算法是计算机科学中的基础内容,本文将介绍 C 语言中几种常见的排序算法,包括实现代码、时间复杂度分析、适用场景和详细解析。 一、冒泡排序(Bubble Sort) 基本思想:重复遍历数组,比较相邻元素,将较大元素交换到右侧。 代码实现: void bubbleSort(int arr[], i…...

IJCAI 2025 | 高德首个原生3D生成基座大模型「G3PT」重塑3D生成的未来
国际人工智能联合会议(IJCAI)是人工智能领域最古老、最具权威性的学术会议之一,自1969年首次举办以来,至今已有近六十年的历史。它见证了人工智能从萌芽到蓬勃发展的全过程,是全球人工智能研究者、学者、工程师和行业专…...

Samtec助力电视广播行业
【摘要前言】 现代广播电视技术最有趣的方面之一就是界限的模糊。过去,音频和视频是通过射频电缆传输的模拟技术采集的,而现在,数字世界已经取代了模拟技术。物理胶片和磁带已让位于数字存储设备和流媒体。 在这个过程中,连接器…...