SpringBoot整合Redis 对象序列化

实体类

@FieldNameConstants
@DynamicUpdate
@DynamicInsert
@Data
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @TableId(value = "id", type = IdType.AUTO)
    @Column(name = "id", columnDefinition = "int")
    private Integer id;
    @Column(name = "name")
    private String name;

    @Column(name = "date")
    private LocalDateTime date;
}

当我保存到redis中,保存失败,因为没有序列化,在实体类中实现Serializable接口

SpringBoot整合Redis 对象序列化_第1张图片

能保存成功 但是在管理工具中看到的是一些不认识的字符

SpringBoot整合Redis 对象序列化_第2张图片

我们再来看看源码,RedissonAutoConfiguration类中,有个默认的redisTemplate,有个@ConditionalOnMissingBean注解,说明我们可以自定义个redisTemplate。

@Bean
@ConditionalOnMissingBean(
    name = {"redisTemplate"}
)
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate template = new RedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
}

 写个RedisConfig类,自定义配置redisTemplate,实现Jason序列化。

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        ObjectMapper objectMapper = new ObjectMapper();
        //设置所有访问权限以及所有的实际类型都可序列化和反序列化
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        //设置值的序列化采用jackson2JsonRedisSerializer
        //StringRedisSerializer
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

再来看看redis中存储的形式,是Jason的格式了,但是日期类型的存储形式太复杂了,有没有简单一点的呢,我这有两种方法。

SpringBoot整合Redis 对象序列化_第3张图片

第一种, 在RedisConfig中添加时间的格式序列化配置

objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.registerModule(new JavaTimeModule());

 日期就没有那么复杂了,简单明了。

SpringBoot整合Redis 对象序列化_第4张图片

 第二种,在时间类型上的字段上加两个注解,这两个注解需要引包


    com.fasterxml.jackson.datatype
    jackson-datatype-jsr310
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@Column(name = "date")
private LocalDateTime date;

再看一看redis里面的格式,将日期里面的内容以逗号分开了

SpringBoot整合Redis 对象序列化_第5张图片

 最后 如果想要日期以自己想要的格式存储的话,在字段上加上注解

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

SpringBoot整合Redis 对象序列化_第6张图片

你可能感兴趣的:(Redis,redis)