虽然 RedisTemplate 和 StringRedisTemplate 都是 Spring 提供的操作 Redis 的模板类,但它们之间在序列化方式和使用场景上有显著区别。
✅ 1. 核心区别:序列化方式不同
🔹 RedisTemplate<Object, Object>
- 默认使用的是
JdkSerializationRedisSerializer,即 Java 的对象序列化方式。 - 存进去的键和值在 Redis 中是二进制格式 (你用
redis-cli查看会是乱码)。 - 适合存储复杂的 Java 对象,比如 Map、List、DTO、实体类等。
java
redisTemplate.opsForValue().set("key", new User("张三", 18));
🔸 StringRedisTemplate
- 使用的是
StringRedisSerializer,即键和值都序列化成字符串(UTF-8)。 - 存入和读取的都是纯文本,适合简洁的数据结构,如:
String、int、JSON 字符串等。 - 常用于缓存基础类型、状态值、JSON 文本等。
java
stringRedisTemplate.opsForValue().set("key", "value");
✅ 2. Redis 中表现不同
| 项目 | RedisTemplate |
StringRedisTemplate |
|---|---|---|
| 序列化 | JDK 默认对象序列化(字节流) | 字符串(UTF-8) |
| 存储格式 | 二进制(看不到真实内容) | 明文(可读字符串) |
| 使用场景 | 存 Java 对象、结构体等复杂数据 | 简单键值对、JSON、数字、字符串等 |
| 可读性 | 不好 | 好 |
| 常见问题 | 类型转换错误、反序列化异常 | 类型简单,少出错 |
✅ 3. 示例:存取相同值
使用 RedisTemplate:
java
redisTemplate.opsForValue().set("count", 1);
Object value = redisTemplate.opsForValue().get("count");
// value 类型是 Object,需要强转成 Integer
但你用 redis-cli get count 是看不到 1,会显示乱码。
使用 StringRedisTemplate:
java
stringRedisTemplate.opsForValue().set("count", "1");
String value = stringRedisTemplate.opsForValue().get("count");
// value 就是 String,无需强转
✅ 4. 如何选择?
| 使用场景 | 建议使用的类 |
|---|---|
| 存储纯字符串、数字、JSON | StringRedisTemplate |
| 存储复杂 Java 对象 | RedisTemplate<Object, Object>(并自定义序列化) |
| 多种类型混合存储(如 key 是 String,value 是对象) | 自定义配置 RedisTemplate<String, Object> |
✅ 5. 实战建议
如果你只处理 String 或整数状态值,优先使用 StringRedisTemplate,避免类型转换异常。
如果一定要用 RedisTemplate,建议这样配置(避免乱码):
java
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置 key 和 value 都使用 String 序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(stringRedisSerializer);
template.afterPropertiesSet();
return template;
}
有用口诀:
StringRedisTemplate是专门为字符串优化的,
RedisTemplate更加通用但默认序列化容易踩坑!