现象:
使用redistemplate操作redis,随后在客户端keys * 查询,发现key值多了前缀,但是不影响程序读写
经查阅资料,是RedisTemplate默认序列化方式用的是JdkSerializationRedisSerializer,此时我将key序列化方式改成StringRedisSerializer,将value序列化方式改为Jackson2JsonRedisSerializer
代码如下
private RedisTemplate redisTemplate;
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
this.redisTemplate = redisTemplate;
}
(这个方法我在自己代码那里是把Object.class改为我对应的实体类了。不然好像是抱错了。也可能是我获取实体的代码有强转的问题。)
修改后再操作,前缀不见了
最后附上常见的序列化方式
下面这个补充方法还没试过
补充:也可直接使用 StringRedisTemplate ,下附redis的缓存配置,可做参考
/**
* ===================================
* 描 述 : Redis + Spring Cache 整合增强
* 包 名 : top.qinxq.single.config
* 创建人 : qinxq
* ===================================
*/
@Configuration
@EnableCaching
@SuppressWarnings("unchecked")
public class RedisCacheConfig extends CachingConfigurerSupport {
@Value("${redis.cache.expiration:60}")
private long expiration;
@Bean
CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(expiration))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerialize()))
.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
template.setValueSerializer(jackson2JsonRedisSerialize());
template.afterPropertiesSet();
return template;
}
private Jackson2JsonRedisSerializer jackson2JsonRedisSerialize(){
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
return jackson2JsonRedisSerializer;
}
}