在 spring data redis 中,存储数据时出现乱码通常是因为 redistemplate 的默认序列化方式(jdkserializationredisserializer)将数据存储为二进制格式,而不是可读的字符串格式。要解决这个问题,你可以通过配置 redistemplate,使用合适的序列化器(如 stringredisserializer 或 jackson2jsonredisserializer)来存储数据。
以下是解决方案和配置示例:
1. 问题原因
- 默认情况下,spring data redis 使用
jdkserializationredisserializer,它会将对象序列化为二进制格式,导致 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.jackson2jsonredisserializer;
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<>();
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.setobjectmapper(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默认序列化乱码内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论