Redis 可视化软件乱码问题(Java序列化重置)

2023-02-22 11:42:30 浏览数 (1)

  • , 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 是指定时间格式。

0 人点赞