StringRedisTemplate 和 RedisTemplate 的区别是什么?

这是一个非常基础又重要的问题!下面用清晰、简洁、新手友好 的方式解释 StringRedisTemplateRedisTemplate 的区别。


🧩 一句话总结

用途
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,不要强转,不要乱码,代码清爽又安全!

相关推荐
WIN赢12 小时前
【抽象思想-从复杂中抽离简单、收敛的口子】
java·前端·javascript
captain37612 小时前
多线程单例模式
java·单例模式·java-ee
xiaotianyuanma12 小时前
【计算机毕业设计】基于Spring Boot的体育馆预约系统的设计与实现
java·spring boot·课程设计
何以解忧,唯有..13 小时前
MySQL 索引分类与底层原理深度剖析
java
水无痕simon13 小时前
6、六大工作模式-2
java·rabbitmq
2601_9638702113 小时前
【计算机毕业设计】基于Spring Boot的非遗文创产品交易平台的设计与实现
java·spring boot·后端
lv__pf13 小时前
Spring之AOP底层源码解析(下)【TL spring14】
java·后端·spring
水无痕simon14 小时前
5、六大工作模式-1
java
andongni20314 小时前
后端参数校验
spring boot·后端·mybatis
KhalilRuan14 小时前
UnityCsReference——笔记
java·开发语言·笔记