本文主要是介绍RedisTemplate默认序列化方式显示中文乱码的解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示...
在 Spring Data Redis 中,存储数据时出现乱码通常是因为 RedisTemplate 的默认序列化方式(JdkSerializationRedisSerializer
)将数据存储为二进制格式,而不是可读的字符串格式。要解决这个问题,你可以通过配置 RedisTemplate
,使用合适的序列化器(如 StringRedisSerializer
或 Jackson2jsonRedisSerializer
)来存储数据。
以下是解决方案和配置示例:
1. 问题原因
- 默认情况下,Spring Data Redis 使用
JdkSerializationRedisSerialiwww.chinasem.cnzer
,它会将对象序列化为二进制格式,导致 Redis 中存储的数据不可读。 - 如果你希望存储为可读的字符串或 JSON 格式,需要修改
RedisTemplate
的序列化器。
2. 解决方案
通过配置 RedisTemplate
,指定 key 和 value 的序列化器。常用的序列化器包括:
StringRedisSerializer
:将 key 和 value 存储为字符串。Jackson2JsonRedisSerializer
:将 value 存储为 JSON 格式。
3. 配置类示例
以下是一个配置类的示例,使用 StringRedisSerializer
和 Jackson2JsonRedisSerializer
:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsChina编程onRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterXML.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<http://www.chinasem.cn>(); template.setConnectionFactory(redisConnectionFactory); // 使用 StringRedisSerializer 序列化 key template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 使用 Jackson2JsonRedisSerializer 序列化 value Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY ); serializer.setObjecjavascripttMapper(objectMapper); template.setValueSerializer(serializer); 编程 template.setHashValueSerializer(serializer); return template; } }
4. 配置说明
StringRedisSerializer
:- 用于序列化 key 和 hash key,确保 key 是字符串格式。
Jackson2JsonRedisSerializer
:- 用于序列化 value 和 hash value,将对象存储为 JSON 格式。
- 通过
ObjectMapper
配置支持多态类型(activateDefaultTyping
),以便反序列化时能正确还原对象类型。
5. 使用示例
配置完成后,RedisTemplate
会自动使用新的序列化器。以下是一个简单的使用示例:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveUser(String key, User user) { redisTemplate.opsForValue().set(key, user); } public User getUser(String key) { return (User) redisTemplate.opsForValue().get(key); } }
6. 验证存储结果
- 使用
StringRedisSerializer
和Jackson2JsonRedisSerializer
后,Redis 中存储的数据将是可读的字符串或 JSON 格式。 - 例如,存储的 key 会是
user:1
,value 会是{"id":1,"name":"John"}
。
7. 注意事项
- 如果已经存储了二进制格式的数据,修改序列化器后,需要手动清理 Redis 中的数据,或者编写迁移脚本将旧数据转换为新格式。
- 如果存储的是复杂对象(如集合或嵌套对象),确保
ObjectMapper
配置正确,以支持反序列化。
总结
通过配置 RedisTemplate
的序列化器,可以解决 Spring Data Redis 存储数据乱码的问题。推荐使用 StringRedisSerializer
和 Jackson2JsonRedisSerializer
,分别处理 key 和 value 的序列化。
到此这篇关于RedisTemplate默认序列化方式显示中文乱码的解决的文章就介绍到这了,更多相关RedisTemplate默认序列化乱码内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于RedisTemplate默认序列化方式显示中文乱码的解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!