以下是 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-active
和max-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. 测试与验证
- 启动 Redis 服务。
- 运行 Spring Boot 应用。
- 使用
curl
或 Postman 测试接口:curl "http://localhost:8080/redis/set?key=name&value=Alice" curl "http://localhost:8080/redis/get?key=name"
总结
通过以上步骤,你可以实现:
- 基础操作:字符串、对象的存储与读取。
- 高级功能:事务、发布/订阅、缓存注解。
- 优化配置:连接池、序列化、集群支持。
根据业务需求选择合适的 Redis 客户端(Lettuce/Jedis)和序列化方式,确保高性能与兼容性。