- , 28 4月 2022
- 作者 847954981@qq.com
- 后端学习
Redis 可视化软件乱码问题(Java序列化重置)
Redis有许多可视化软件,但直接使用这些软件来查看Redis会发现是一堆乱码。
原因是Redis是独立软件,并且不是Java开发的,所以Java程序存入Redis数据时,会把数据序列化。
而Java默认的序列化方式,是把内容编程字节码,计算机能识别,但人就识别不了,看起来像乱码
解决办法
为解决这个问题,我们需要通过方法重置序列化方式
创建一个Config类(并写上注解)
写入方法:
代码语言:javascript复制@Bean
public RedisTemplate redisTemplateInit() {
//设置序列化Key的工具
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置序列化Value的工具
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// 设置 hash 的 key
redisTemplate.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
// 设置 hash 的 value
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
Redis数据的key用字符串(StringRedisSerializer
)的序列化/反序列化方式,Value 用 JSON(
GenericJackson2JsonRedisSerializer
)的序列化/反序列化方式。
hash是一种Redis的数据类型。setHashKeySerializer()
和 setHashValueSerializer()
是支持hash的。
添加了config类后,因为序列化方式改变,所以旧数据不再兼容。
新问题
此时,如果我们想插入时间会出错,原因是存入时需要序列化,而我们设定的GenericJackson2JsonRedisSerializer 并不支持LocalDateTime,所以在模型的时间属性上,需要多加两个注解:
引入包:
代码语言:javascript复制import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
代码语言:javascript复制public class Category implements Serializable {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime gmtCreated;
}
@JsonSerialize
注解用于指定 序列化 的工具类,推荐LocalDateTimeSerializer
;@JsonDeserialize
注解用于指定 反序列化 的工具类,推荐LocalDateTimeDeserializer
LocalDate 有对应的 LocalDateSerializer 和 LocalDateDeserializer;LocalTime 有对应的 LocalTimeSerializer 和 LocalTimeDeserializer
@JsonFormat
是指定时间格式。