【Redis】StringRedisTemplate 和 RedisTemplate 的区别

发布于:2025-07-04 ⋅ 阅读:(21) ⋅ 点赞:(0)

StringRedisTemplateRedisTemplate 是 Spring Data Redis 提供的两种用于操作 Redis 的模板类,它们的核心区别在于 序列化方式操作的数据类型。以下是两者的主要区别和使用建议:


✅ 1. 数据类型支持

类名 支持的数据类型 说明
RedisTemplate 支持所有 Redis 数据结构(如 String、Hash、List、Set、ZSet) 可以操作任意 Java 对象,但需要手动配置序列化方式
StringRedisTemplate 主要用于操作字符串类型 已经默认使用 StringSerializer,适合处理字符串键值对

✅ 2. 序列化方式

属性 RedisTemplate StringRedisTemplate
Key 序列化器 JdkSerializationRedisSerializer(默认) StringRedisSerializer
Value 序列化器 JdkSerializationRedisSerializer(默认) StringRedisSerializer
HashKey 序列化器 JdkSerializationRedisSerializer StringRedisSerializer
HashValue 序列化器 JdkSerializationRedisSerializer StringRedisSerializer

⚠️ 使用 RedisTemplate 存储字符串时,如果不自定义序列化器,会以 JDK 序列化方式存储,导致在 Redis 客户端看到的是乱码。


✅ 3. 适用场景

场景 推荐使用
操作纯字符串(如 token、简单缓存) StringRedisTemplate
操作复杂对象或多种数据结构(如 List、Set、Hash) RedisTemplate(需配置合适的序列化器,如 GenericJackson2JsonRedisSerializerJackson2JsonRedisSerializer

✅ 4. 示例对比

使用 StringRedisTemplate

@Autowired
private StringRedisTemplate stringRedisTemplate;

// 存字符串
stringRedisTemplate.opsForValue().set("key", "value");

// 取字符串
String value = stringRedisTemplate.opsForValue().get("key");

使用 RedisTemplate

@Autowired
private RedisTemplate<String, Object> redisTemplate;

// 存对象
redisTemplate.opsForValue().set("user:1", user);

// 取对象
User user = (User) redisTemplate.opsForValue().get("user:1");

✅ 建议

  • 如果你只操作字符串,推荐使用 StringRedisTemplate,它更简单、直观。
  • 如果你需要操作复杂对象或多种数据结构,请使用 RedisTemplate,并建议配置统一的 JSON 序列化器(如 GenericJackson2JsonRedisSerializer),避免出现序列化不一致的问题。

🔧 示例:配置 RedisTemplate 使用 JSON 序列化器

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(factory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
}

这样可以确保你在操作对象时,Redis 中保存的是可读性较好的 JSON 格式。