Redis中RedisTemplate 和 StringRedisTemplate的区别

虽然 RedisTemplateStringRedisTemplate 都是 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)。
  • 存入和读取的都是纯文本,适合简洁的数据结构,如:Stringint、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 更加通用但默认序列化容易踩坑!

相关推荐
tian_jiangnan2 小时前
Flink 流计算进阶:手写一套通用的 Redis/MySQL /Kafka数据源封装工具类
redis·mysql·flink
马优晨6 小时前
Spring Boot + MyBatis + Redis 整合实战 —— 项目源码深度解析
spring boot·redis·mybatis·mybatis + redis·redis实战·spring实战·mybatis实战
ShiXZ21311 小时前
Redis 常用指令全集:redis-cli 实战速查手册
数据库·redis·缓存
为你学会写情书1 天前
Redis 从入门到实战:一篇搞定核心数据结构与 NestJS 集成
redis
喜欢的名字被抢了1 天前
长会话状态治理:当Redis失忆后,系统如何自己找回忆
数据库·redis·缓存
海兰1 天前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
千河殇 多想和她2 天前
线上 Redis 突然“爆”了,怎么办?
数据库·redis·bootstrap
Bug收容所2 天前
12305项目学习day5
java·spring boot·redis·mysql·spring·rocketmq
智码看视界2 天前
Day33-数据层 × 中间件AI化篇:Redis缓存经典问题-击穿、穿透、雪崩的终极解决方案
数据库·redis·缓存·中间件·穿透·雪崩·击穿
后端观测站3 天前
第九章:Redis 为什么会发生缓存穿透、击穿、雪崩?
redis