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序列化方式。