前言
今天在使用springboot整合redis时出现序列化乱码的问题,再此做一次记录
出现的问题
在使用终端添加数据的时候是没有问题的,当时使用spring去添加redis的数据的时候,key的前面会有乱码,虽然通过spring去取出数据没有问题,但是不方便我们在终端查询和看数据

- 没有乱码的是通过终端去添加的,乱码的是通过spring去添加的。
出现问题的原因
spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,这种方式似乎会导致序列化出现乱码,需要修改序列化的方式,下面提供修改方法
解决方法
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
@Configuration
public class redis_config extends CachingConfigurerSupport{
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
// @SuppressWarnings("rawtypes")
// @Bean
// public CacheManager cacheManager(RedisTemplate redisTemplate) {
// RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
// //设置缓存过期时间
// //rcm.setDefaultExpiration(60);//秒
// return rcm;
// }
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;
}
}
- 将序列化的方法改成StringRedisSerializer

本文记录了在使用SpringBoot整合Redis时遇到的序列化导致的乱码问题,问题出现在Spring的RedisTemplate使用JdkSerializationRedisSerializer进行序列化时。解决方法是将序列化方式改为StringRedisSerializer,以避免乱码并方便终端查询和查看数据。

763

被折叠的 条评论
为什么被折叠?



