java
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
//template.setValueSerializer(stringRedisSerializer);
// hash的value序列化方式采用jackson
// template.setHashValueSerializer(stringRedisSerializer);//(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
自定义RedisTemplate与默认RedisTemplate配置比较
下面我将比较自定义的RedisTemplate配置与Spring Boot默认提供的RedisTemplate配置之间的主要区别:
1. 序列化方式
默认RedisTemplate配置
- Key序列化 :使用
JdkSerializationRedisSerializer
- 生成二进制key,不可读(如:
\xac\xed\x00\x05t\x00\x03key
)
- 生成二进制key,不可读(如:
- Value序列化 :同样使用
JdkSerializationRedisSerializer
- Java对象被序列化为二进制格式
- 占用空间相对较大
- 不同语言客户端无法读取
自定义RedisTemplate配置
- Key序列化 :使用
StringRedisSerializer
- 生成可读的字符串key(如:
"user:1001"
) - 便于调试和管理
- 生成可读的字符串key(如:
- Value序列化 :配置了
Jackson2JsonRedisSerializer
(虽然被注释)- 将对象序列化为JSON格式
- 可读性强
- 占用空间相对较小
- 其他语言客户端可以读取
2. 类型处理能力
默认配置
- 使用JDK序列化可以保留完整的类型信息
- 但仅限于Java客户端使用
自定义配置
- 使用Jackson序列化并启用
enableDefaultTyping
- 在JSON中嵌入类型信息(
@class
字段) - 可以反序列化为原始类型
- 但有潜在的安全风险(反序列化漏洞)
- 在JSON中嵌入类型信息(
3. 实际存储效果示例
默认配置存储对象:
key: \xac\xed\x00\x05t\x00\x04user
value: \xac\xed\x00\x05sr\x00\x0com.example.User...
自定义配置存储对象:
key: "user:1001"
value: {"@class":"com.example.User","id":1001,"name":"张三"...}
4. 优缺点对比
特性 | 默认配置 | 自定义配置 |
---|---|---|
可读性 | 差(二进制) | 好(可读字符串和JSON) |
跨语言支持 | 仅Java | 支持任何JSON解析器 |
存储效率 | 一般(JDK序列化体积较大) | 较好(JSON相对紧凑) |
类型安全 | 高 | 中(enableDefaultTyping有风险) |
调试便利性 | 差 | 好 |
兼容性 | 只适用于Java应用 | 多语言环境友好 |
5. 关键差异总结
-
Key的可读性:自定义配置使用字符串序列化,极大提升了key的可读性和管理便利性
-
Value的格式:自定义配置倾向于使用JSON而非Java原生序列化,更适合现代应用开发
-
互操作性:自定义配置使Redis数据可以被非Java客户端读取和修改
-
安全考虑 :默认配置更安全,自定义配置的
enableDefaultTyping
可能带来反序列化风险 -
灵活性:自定义配置可以更灵活地处理复杂对象结构
6. 使用建议
-
使用自定义配置当:
- 需要可读的Redis key
- 需要与其他语言服务共享Redis数据
- 需要直接通过Redis CLI查看和调试数据
-
使用默认配置当:
- 仅Java应用使用Redis
- 对安全性要求极高
- 不需要人工查看Redis中的数据
实际开发中,大多数项目会选择类似这里的自定义配置,但会进一步优化安全性和性能。