Redis 集成
依赖与准备
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
本地先启动一个 Redis(默认端口 6379),或使用 Docker 等方式。Spring Boot 3 起数据类配置统一放在 spring.data.redis.* 前缀下(2.x 为 spring.redis.*)。
连接配置
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.password=
spring.data.redis.database=0 # 默认使用 0 号库
连接池、超时等更多选项以官方文档为准。客户端方面,Boot 默认使用 Lettuce(该默认自 2.x 延续,4.x 是否有调整以官方文档为准)。
自动提供的两个模板
RedisTemplate<Object, Object>:键值都按 Object 处理,默认 JDK 序列化(键可读性差、跨语言不通用);StringRedisTemplate:键值均为 String 序列化,日常最常用——配合 JSON 字符串存取,可读性与通用性最好。
基本操作
@Service
public class CacheService {
private final StringRedisTemplate redis;
public CacheService(StringRedisTemplate redis) {
this.redis = redis;
}
public void demo() {
// String
redis.opsForValue().set("greeting", "hello");
String v = redis.opsForValue().get("greeting");
// 带过期时间
redis.opsForValue().set("token", "abc", Duration.ofMinutes(30));
// 计数器
Long n = redis.opsForValue().increment("page:view");
// Hash / List / Set / ZSet 分别用对应 ops
redis.opsForHash().put("user:1", "name", "张三");
String name = (String) redis.opsForHash().get("user:1", "name");
redis.opsForList().leftPush("queue", "job-1");
}
}
每种数据结构对应一个 opsForXxx():opsForValue(String)、opsForHash、opsForList、opsForSet、opsForZSet,方法名与 Redis 命令一一对应(set/get、hset/hget、lpush 等)。
对象存取:Jackson JSON
对象先序列化成 JSON 字符串再存,避免 JDK 序列化的坑:
ObjectMapper mapper = new ObjectMapper(); // 一般注入 Boot 配置好的实例
User user = new User(1L, "张三");
redis.opsForValue().set("user:1", mapper.writeValueAsString(user));
User back = mapper.readValue(redis.opsForValue().get("user:1"), User.class);
若希望整个应用的 RedisTemplate 默认就用 JSON,可以自定义 RedisTemplate Bean,把 key/value 序列化器换成 StringRedisSerializer 与 Jackson2JsonRedisSerializer(或 GenericJackson2JsonRedisSerializer),具体写法与注意点以官方文档为准。
典型应用
- 热点数据缓存(若用 Spring 缓存抽象则见 19 章,二者结合更佳);
- 计数器、限流计数;
- 分布式锁(基于 SETNX/过期时间等原语,成熟封装请参考 Redisson 等库的官方文档);
- 会话共享、发布订阅等进阶场景。
小结
Redis 集成 = 一个 starter + 一组 spring.data.redis.* 配置 + StringRedisTemplate 调用。先掌握 opsFor 系列与过期时间,再根据场景引入对象 JSON 化与缓存抽象。