redisTemplate解决序列化问题
解决redis序列化问题,学习StringRedisTemplate
·
目录
这里JsonUtil,自己封装的工具类【工具类使用的Gson】
问题
使用redisTemplate时,如果不指定序列化的格式,默认采用的是JDK中的ObjectOutputStream
存入redis后展示的结果
key :"\xac\xed\x00\x05t\x00\x04name"
value :"\xac\xed\x00\x05t\x00\x04jack
解决
一. 使用redisTemplate,修改配置
修改redisTemplate中这四个值
key ==》 keySerializer【string】
hashKeySerializer【hash】
value ==》 valueSerializer【string】
hashValueSerializer【hash】
RedisSerializer 中有两个可以实现类可以解决
编写配置类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 准备RedisTemplate对象
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key的序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// 设置value的序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
// 返回
return redisTemplate;
}
}
这时数据再次存放到redis,key和value恢复正常
存储对象
【实现序列化接口】,在redis中,value会自动序列化,转化为JSON
取出的时候,会自动反序列化,转化为对象
二. 使用StringRedisTemplate
注意:
- 不需要编写配置类
- 不会自动序列化,key和value存储的都是String
- 存储的时候需要转换JSON
- 取出的时候再转换成实体类
这里JsonUtil,自己封装的工具类【工具类使用的Gson】
public class JsonUtil {
/**
* 转换成JSON
* @param o 要转换的对象
* @return 转换成的JSON
*/
public static String toJSON(Object o){
Gson gson = new Gson();
return gson.toJson(o);
}
/**
* 转换成对象
* @param json JSON
* @param classOfT 对应的类字节码
* @param <T> 返回的类型
* @return 转换成的对象
*/
public static <T> T fromJson(String json,Class<T> classOfT){
Gson gson = new Gson();
return gson.fromJson(json,(Type) classOfT);
}
}
区别:
使用自动序列化后 存储在内存大小为:518
不使用自动序列化后 存储在内存大小为:258
更多推荐
已为社区贡献3条内容
所有评论(0)