这是一个非常基础又重要的问题!下面用清晰、简洁、新手友好 的方式解释 StringRedisTemplate 和 RedisTemplate 的区别。
🧩 一句话总结
| 类 | 用途 |
|---|---|
StringRedisTemplate |
专门用来操作字符串(key 和 value 都是 String) |
RedisTemplate<K, V> |
通用模板,key 和 value 可以是任意 Java 对象(需序列化) |
🔍 详细对比
| 特性 | StringRedisTemplate |
RedisTemplate<String, Object> |
|---|---|---|
| key 类型 | String |
任意类型(通常用 String) |
| value 类型 | String |
任意对象(如 List<User>, User, Integer 等) |
| 底层序列化 | 默认使用 StringRedisSerializer(存的是可读字符串) |
默认使用 JDK 序列化(存的是二进制乱码) |
| Redis 中看到的数据 | "shop:type:list" → "[{\"id\":1,\"name\":\"水果\"}]"(JSON 可读) |
"shop:type:list" → "\xac\xed\x00\x05sr\x00..."(乱码) |
| 适用场景 | 存 JSON、计数器、简单字符串等 | 存 Java 对象(但需自定义序列化才实用) |
| 是否需要手动序列化 | ❌ 不需要(你传 String 就存 String) | ✅ 通常需要(否则是 JDK 乱码) |
💡 举个例子
用 StringRedisTemplate(推荐用于 JSON 缓存):
java
@Autowired
private StringRedisTemplate stringRedisTemplate;
// 存
stringRedisTemplate.opsForValue().set("user:1", "{\"name\":\"张三\",\"age\":20}");
// 取
String json = stringRedisTemplate.opsForValue().get("user:1"); // 直接得到字符串
用默认的 RedisTemplate(不推荐,会乱码):
java
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// 存
redisTemplate.opsForValue().set("user:1", new User("张三", 20));
// Redis 里看到的是二进制乱码!无法调试
所以:除非你自定义了
RedisTemplate的序列化方式(比如改成 JSON),否则它并不好用。
✅ 实际开发建议(新手必看)
| 场景 | 推荐用法 |
|---|---|
缓存对象列表(如 List<ShopType>) |
✅ StringRedisTemplate + JSONUtil.toJsonStr() / ObjectMapper |
| 实现分布式锁、计数器、简单标志位 | ✅ StringRedisTemplate |
| 想直接存 Java 对象(不转 JSON) | ⚠️ 可以,但必须自定义 RedisTemplate 的序列化器为 JSON |
| 不确定用哪个 | 👉 优先用 StringRedisTemplate,更简单、安全、可读 |
🛠️ 补充:为什么 Spring Boot 提供两个?
RedisTemplate是底层通用模板,灵活性高,但需要配置。StringRedisTemplate是它的"特化版",预设 key/value 都是 String,开箱即用,适合 80% 的业务场景(尤其是 Web 开发中缓存 JSON)。
官方文档也说:"如果你只操作字符串,用
StringRedisTemplate。"
✅ 总结
StringRedisTemplate |
RedisTemplate |
|
|---|---|---|
| 简单? | ✅ 超简单 | ❌ 需配置序列化 |
| 可读? | ✅ Redis 里是 JSON/文本 | ❌ 默认是乱码 |
| 新手友好? | ✅ 强烈推荐 | ⚠️ 容易踩坑 |
| 该用哪个? | 👉 大多数情况选它! | 仅当你明确需要泛型对象且已配置好序列化 |
💡 记住:存 JSON 字符串用
StringRedisTemplate,不要强转,不要乱码,代码清爽又安全!