2026/4/13 16:57:44
网站建设
项目流程
青岛网站快速排名优化,足球比赛直播间在线观看,门户网站 意义,一流的句容网站建设一、前言
在分布式系统开发中#xff0c;缓存是提升接口响应速度、减轻数据库压力的关键手段。Redis 作为高性能的键值对数据库#xff0c;凭借其支持多种数据结构、读写速度快、可持久化等特性#xff0c;成为 Spring Boot 项目的首选缓存方案。本文将从环境准备、依赖配置…一、前言在分布式系统开发中缓存是提升接口响应速度、减轻数据库压力的关键手段。Redis 作为高性能的键值对数据库凭借其支持多种数据结构、读写速度快、可持久化等特性成为 Spring Boot 项目的首选缓存方案。本文将从环境准备、依赖配置、代码实现、缓存策略优化四个维度带大家从零实现 Spring Boot 与 Redis 的无缝集成附完整代码示例和常见问题解决方案。二、环境准备1. 基础环境JDK 1.8Spring Boot 2.7.x兼容 2.x 版本3.x 版本配置略有差异Redis 6.2.x本地或云服务器部署均可Maven 3.62. Redis 环境验证确保 Redis 服务正常启动可通过以下命令测试连接# 本地 Redis 连接redis-cli -h 127.0.0.1 -p 6379# 输入 ping返回 PONG 则表示连接正常127.0.0.1:6379 pingPONG三、核心配置步骤1. 引入 Maven 依赖在 pom.xml 中添加 Spring Boot 整合 Redis 的核心依赖无需额外引入 Redis 客户端Spring Boot 自动适配 Lettuce 客户端Redis starter --dependencyorg.springframework.boot-boot-starter-data-redis/artifactId依赖Lettuce 底层依赖 commons-pool2 --.apache.commons ool2/dependency2. 配置 application.yml在配置文件中添加 Redis 连接信息、连接池配置和缓存通用配置spring:# Redis 配置redis:host: 127.0.0.1 # Redis 服务器地址port: 6379 # 端口号password: # 若未设置密码则留空database: 0 # 操作的数据库索引默认 0# Lettuce 连接池配置lettuce:pool:max-active: 8 # 最大连接数max-idle: 8 # 最大空闲连接数min-idle: 2 # 最小空闲连接数max-wait: -1ms # 最大等待时间-1 表示无限制# 缓存通用配置cache:type: redis # 缓存类型为 Redisredis:time-to-live: 3600000ms # 缓存默认过期时间1 小时cache-null-values: false # 是否缓存 null 值避免缓存穿透use-key-prefix: true # 是否使用缓存前缀默认前缀为 cache:3. 自定义 Redis 配置类Spring Boot 自动配置的 RedisTemplate 序列化方式为 JDK 序列化存在可读性差、占用空间大的问题。我们通过自定义配置类将序列化方式改为 JSON 格式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.cache.RedisCacheManager;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;ConfigurationEnableCaching // 开启缓存注解支持public class RedisConfig {/*** 自定义 RedisTemplate解决默认序列化问题*/Beanpublic RedisTemplate, Object redisTemplate(RedisConnectionFactory factory) {RedisTemplate, Object template new RedisTemplate template.setConnectionFactory(factory);// 字符串序列化器key 采用 String 序列化StringRedisSerializer stringSerializer new StringRedisSerializer();template.setKeySerializer(stringSerializer);template.setHashKeySerializer(stringSerializer);// JSON 序列化器value 采用 JSON 序列化GenericJackson2JsonRedisSerializer jsonSerializer new GenericJackson2JsonRedisSerializer();template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);// 初始化模板template.afterPropertiesSet();return template;}/*** 自定义 RedisCacheManager统一缓存配置*/Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory factory) {// 缓存配置JSON 序列化 过期时间RedisCacheConfiguration config RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.hours(1)) // 默认过期时间 1 小时.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // key 序列化.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // value 序列化.disableCachingNullValues(); // 不缓存 null 值// 构建缓存管理器return RedisCacheManager.builder(factory).cacheDefaults(config).build();}}四、实战缓存注解的使用1. 实体类准备创建用户实体类需实现序列化接口或使用 JSON 序列化时无需显式实现import lombok.Data;Datapublic class User {private Long id;private String username;private String phone;private Integer age;}2. Service 层缓存实现通过 Cacheable、CachePut、CacheEvict 三个核心注解实现缓存的增删改查import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CachePut;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import java.util.HashMap;import java.util.Map;Servicepublic class UserService {// 模拟数据库存储private static final Map USER_DB new HashMap();static {// 初始化测试数据USER_DB.put(1L, new User(1L, 张三, 13800138000, 25));USER_DB.put(2L, new User(2L, 李四, 13900139000, 30));}/*** 查询用户缓存存在则返回缓存数据不存在则执行方法并缓存结果* key缓存键默认使用方法参数作为 key这里显式指定为 user::id*/Cacheable(value user, key #id, unless #result null)public User getUserById(Long id) {System.out.println( 执行数据库查询id id );return USER_DB.get(id);}/*** 更新用户执行方法后更新缓存覆盖原缓存*/CachePut(value user, key #user.id)public User updateUser(User user) {System.out.println( 执行数据库更新id user.getId() );USER_DB.put(user.getId(), user);return user;}/*** 删除用户执行方法后删除对应缓存*/CacheEvict(value user, key #id)public void deleteUser(Long id) {System.out.println( 执行数据库删除id id );USER_DB.remove(id);}}3. 测试接口Controller 层import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;RestControllerRequestMapping(/user)public class UserController {Autowiredprivate UserService userService;GetMapping(/{id})public User getUser(PathVariable Long id) {return userService.getUserById(id);}PutMappingpublic User updateUser(RequestBody User user) {return userService.updateUser(user);}DeleteMapping(/{id})public String deleteUser(PathVariable Long id) {userService.deleteUser(id);return 删除成功;}}五、缓存优化与避坑指南1. 缓存穿透问题解决原因查询不存在的 key 时缓存未命中导致频繁访问数据库。解决方案配置 cache-null-values: true缓存 null 值过期时间设为 5-10 分钟接口层增加参数校验过滤无效 id如小于 1 的 id。2. 缓存击穿问题解决原因热点 key 过期瞬间大量请求同时访问数据库。解决方案热点 key 设置永不过期或超长过期时间使用互斥锁如 Redis 的 SETNX确保同一时间只有一个请求更新缓存。3. 缓存雪崩问题解决原因大量缓存 key 同时过期导致数据库压力骤增。解决方案缓存过期时间添加随机值如 time-to-live: ${random.int[3600000, 7200000]}ms核心业务缓存集群部署避免单点故障。4. 序列化问题注意事项避免使用 JDK 序列化可读性差、占用空间大优先使用 JSON 序列化实体类若使用 Lombok需确保有无参构造函数JSON 反序列化依赖若实体类属性有新增 / 删除建议清理旧缓存避免反序列化失败。六、总结本文详细介绍了 Spring Boot 集成 Redis 的完整流程从环境搭建、配置优化到实战应用覆盖了缓存注解的核心使用场景和常见问题解决方案。通过 Redis 缓存可显著提升接口响应速度毫秒级响应尤其适用于高频查询、数据变更较少的场景如用户信息、商品详情等。后续可进一步探索 Redis 的高级特性如分布式锁、消息队列、地理位置存储等欢迎在评论区交流探讨