java redis存储键值包含\xac\xed\x00\x05t\x00\特殊字符
java RedisTemplate操作redis后,想看一下是否成功,
就redis-cli执行:keys *
1) "\xac\xed\x00\x05t\x00\x04name"
2) "a"
3) "siteName"
4) "\xac\xed\x00\x05t\x00\bsiteName"
5) "myCache::userName"
发现存储键值包含\xac\xed\x00\x05t\x00\特殊字符。
原因:RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化。
spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化。
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
if (enableDefaultSerializer) {
if (keySerializer == null) {
keySerializer = defaultSerializer;
defaultUsed = true;
}
if (valueSerializer == null) {
valueSerializer = defaultSerializer;
defaultUsed = true;
}
if (hashKeySerializer == null) {
hashKeySerializer = defaultSerializer;
defaultUsed = true;
}
if (hashValueSerializer == null) {
hashValueSerializer = defaultSerializer;
defaultUsed = true;
}
}
if (enableDefaultSerializer && defaultUsed) {
Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");
}
if (scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor<K>(this);
}
initialized = true;
}
这是因为存取序列化的方式为org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
将序列化的方式改为 org.springframework.data.redis.serializer.StringRedisSerializer
会自动去掉\xac\xed\x00\x05t\x00
前缀
解决:方案1 使用 StringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate;
方案2 修改默认的序列化方式:
private RedisTemplate redisTemplate;
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
将redisTemplate默认改为stringRedis序列化方式。
转载:https://blog.csdn.net/ZYC88888/article/details/101557215
查看评论