StringRedisTemplate
和 RedisTemplate
是 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 (需配置合适的序列化器,如 GenericJackson2JsonRedisSerializer 或 Jackson2JsonRedisSerializer ) |
✅ 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 格式。