解决Spring Boot 使用RedisTemplate 存储键值出现乱码 xacxedx00x05tx00

时间:2025-02-16 09:30:37

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

127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x04pass"
2) "\xac\xed\x00\x05t\x00\x04name"
3) "name"

 

spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,如下

 

private boolean enableDefaultSerializer = true;
private RedisSerializer<?> defaultSerializer = new JdkSerializationRedisSerializer();
private RedisSerializer keySerializer = null;
private RedisSerializer valueSerializer = null;
private RedisSerializer hashKeySerializer = null;
private RedisSerializer hashValueSerializer = null;

解决方法:更改序列化方式

private RedisTemplate redisTemplate;

@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
    RedisSerializer stringSerializer = new StringRedisSerializer();
    (stringSerializer);
    (stringSerializer);
    (stringSerializer);
    (stringSerializer);
     = redisTemplate;
}

补充:也可直接使用 StringRedisTemplate ,下附redis的缓存配置,可做参考

/**
 * ===================================
 * 描 述 : Redis + Spring Cache 整合增强
 * 包 名 : 
 * 创建人 : qinxq
 * ===================================
 */
@Configuration
@EnableCaching
@SuppressWarnings("unchecked")
public class RedisCacheConfig extends CachingConfigurerSupport {
    @Value("${:60}")
    private long expiration;

    @Bean
    CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        // 配置序列化(解决乱码的问题)
        RedisCacheConfiguration config = ()
                .entryTtl((expiration))
                .serializeValuesWith((jackson2JsonRedisSerialize()))
                .disableCachingNullValues();

        return (connectionFactory).cacheDefaults(config).build();
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        (jackson2JsonRedisSerialize());
        ();
        return template;
    }

    private Jackson2JsonRedisSerializer jackson2JsonRedisSerialize(){
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer();
        ObjectMapper om = new ObjectMapper();
        (, );
        (.NON_FINAL);
        (om);
        return jackson2JsonRedisSerializer;
    }
}