前言:
RedisTemplate 和 StringRedisTemplate 都是 Spring 提供的操作 Redis 的模板类,但它们之间在序列化方式和使用场景上有显著区别。
序列化方式不同
RedisTemplate<Object, Object>
- 默认使用的是 JdkSerializationRedisSerializer,即 Java 的对象序列化方式。
- 存进去的键和值在 Redis 中是二进制格式。
- 适合存储复杂的 Java 对象,比如 Map、List、DTO、实体类等。
redisTemplate.opsForValue().set("key", new User("张三", 18));
StringRedisTemplate
- 使用的是 StringRedisSerializer,即键和值都序列化成字符串(UTF-8)。
- 存入和读取的都是纯文本,适合简洁的数据结构,如:String、int、JSON 字符串等。
- 常用于缓存基础类型、状态值、JSON 文本等。
stringRedisTemplate.opsForValue().set("key", "value");
Redis 中表现不同
存取相同值
使用 RedisTemplate:
redisTemplate.opsForValue().set("count", 1);
Object value = redisTemplate.opsForValue().get("count");
// value 类型是 Object,需要强转成 Integer
使用 StringRedisTemplate:
stringRedisTemplate.opsForValue().set("count", "1");
String value = stringRedisTemplate.opsForValue().get("count");
// value 就是 String,无需强转
如何选择?
建议
只处理 String 或整数状态值,优先使用 StringRedisTemplate,避免类型转换异常。
一定要用 RedisTemplate,建议这样配置(避免乱码):
@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;
}
总结
在 Spring 框架中,`RedisTemplate` 和 `StringRedisTemplate` 是用于操作 Redis 数据库的核心类。它们封装了对 Redis 的各种操作,提供了简洁的 API 来执行常见的 Redis 命令。