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)、opsForHashopsForListopsForSetopsForZSet,方法名与 Redis 命令一一对应(set/gethset/hgetlpush 等)。

对象存取: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 序列化器换成 StringRedisSerializerJackson2JsonRedisSerializer(或 GenericJackson2JsonRedisSerializer),具体写法与注意点以官方文档为准。

典型应用

  • 热点数据缓存(若用 Spring 缓存抽象则见 19 章,二者结合更佳);
  • 计数器、限流计数;
  • 分布式锁(基于 SETNX/过期时间等原语,成熟封装请参考 Redisson 等库的官方文档);
  • 会话共享、发布订阅等进阶场景。

小结

Redis 集成 = 一个 starter + 一组 spring.data.redis.* 配置 + StringRedisTemplate 调用。先掌握 opsFor 系列与过期时间,再根据场景引入对象 JSON 化与缓存抽象。

笔记加载中…