StringRedisTemplate更适合绝大多数日常场景,因其默认使用StringRedisSerializer,确保key和value以UTF-8明文存储,避免乱码、兼容跨语言调用且便于调试;而RedisTemplate默认采用JdkSerializationRedisSerializer,将对象序列化为不可读的二进制字节流,易导致反序列化失败、存储膨胀及跨服务解析障碍。

StringRedisTemplate 更适合绝大多数日常场景,除非你明确需要存 Java 对象且已配置好 JSON 序列化器,否则直接用 StringRedisTemplate。
它不绕弯、不乱码、不跨语言兼容问题,调试时打开 Redis Desktop Manager 就能一眼看清 key 和 value —— 这不是“更好”,而是“更少踩坑”。
为什么 RedisTemplate 存的数据在 Redis 里是乱码?
因为 RedisTemplate 默认用 JdkSerializationRedisSerializer,把对象序列化成二进制字节数组(比如 \xac\xed\x00\x05t\x00\x08user:1),Redis 本身不理解这种格式,只当普通字节流存。你用 redis-cli get user:1 看到的是一堆不可读字符,其他语言客户端根本没法解析。
-
StringRedisTemplate用的是StringRedisSerializer,全程 UTF-8 编码,存进去什么样,Redis 里就什么样 - 即使你强行用
RedisTemplate存字符串,比如redisTemplate.opsForValue().set("k", "v"),value 依然走 JDK 序列化 → 结果还是乱码 - 想让
RedisTemplate明文可读,必须手动配置 key/value 的序列化器为StringRedisSerializer或Jackson2JsonRedisSerializer
StringRedisTemplate 能不能存对象?
不能直接存,会报 ClassCastException: cannot cast to String。它只接受 String 类型的 key 和 value。
- 想存对象?先手动转成 JSON 字符串:
objectMapper.writeValueAsString(user),再用stringRedisTemplate.opsForValue().set("user:1", json) - 取的时候再反序列化:
objectMapper.readValue(json, User.class) - 这不是缺点,而是设计意图:它不负责对象生命周期,只管字符串搬运
- 如果项目里大量重复写这一步,说明该抽个工具类封装,而不是换用
RedisTemplate
两个模板操作的数据互不相通
StringRedisTemplate 和 RedisTemplate 写入的数据,在 Redis 里是同一份物理存储,但读取逻辑完全隔离 —— 因为它们用的序列化/反序列化方式不同。
- 用
StringRedisTemplate存"user:1"→ Redis 里存的是明文"{\"id\":1,\"name\":\"张三\"}" - 用
RedisTemplate(默认配置)读"user:1"→ 它按 JDK 反序列化,失败,返回null - 反过来也一样:用
RedisTemplate存的数据,StringRedisTemplate读出来是乱码字符串,不是原始对象 - 它们不是“两个视角看同一份数据”,而是“两套协议写/读同一块内存”
set 就确认序列化路径是否闭环。


















