FAQ:redis key/value 前面出现\xAC\xED\x00\x05t\x00\x05

 

1.问题现象:

最近使用spring-data-redis 和jedis 操作redis时发现存储在redis中的key不是程序中设置的string值,前面还多出了许多类似\xac\xed\x00\x05t\x00这种字符串

FAQ:redis key/value 前面出现\xAC\xED\x00\x05t\x00\x05

2.原因:

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;
    }

3.解决方案

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

另一种方式,因为我redisTemplate用了@Resource进行了注解,需要上面的序列化才能改。或者把注解改为@Autowired,不用写上面那些序列化方法,问题就解决了

上一篇:HelloWorld


下一篇:kaptcha验证码实现,配合spring boot使用