Redis序列化存储及其日期格式问题

万花从中过
片页不沾身

在模块开发中,使用Redis做缓存是非常常见的技术,当我们注入RedisTempate模板时

redisTemplate.opsForValue().set("item_"+id,itemModel,10, TimeUnit.MINUTES);

key我们可以用固定开头和商品id进行拼接,当然正常的项目开发中最好使用多级目录进行分类,这里只做演示使用

可视化界面看到保存的数据是这样的
Redis序列化存储及其日期格式问题_第1张图片
这样的数据是很不容易阅读的,原因是Redis默认使用的是JAVA序列化方式,在序列化时使用了Redis协议中的编码。

不过在这种痛苦的数据面前做调试等工作无疑是非常不舒服的,这时候就需要我们自定义序列化方式

@Configuration
public class RedisConfig {
     

    /**
     * 修改Redis默认的序列化方式,默认文件在RedisAutoConfiguration
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
     
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置key的序列化方式为string
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        //设置value的序列化方式为json
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //定制化关于时间格式序列化问题
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(DateTime.class,new JodaDateTimeJsonSerializer());
        simpleModule.addDeserializer(DateTime.class,new JodaDateTimeJsonDeSerializer());
        objectMapper.registerModule(simpleModule);
        //在保存结果中加入类信息,方便解析数据
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        return redisTemplate;
    }
}
public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {
     
    @Override
    public void serialize(DateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
     
        gen.writeString(value.toString("yyyy-MM-dd HH:mm:ss"));
    }
}
public class JodaDateTimeJsonDeSerializer extends JsonDeserializer<DateTime> {
     

    @Override
    public DateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
     
        String s = p.readValueAs(String.class);
        DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
        return DateTime.parse(s,dateTimeFormatter);
    }
}

Redis序列化存储及其日期格式问题_第2张图片

文章持续更新,可以微信搜索「 绅堂Style 」第一时间阅读,回复【资料】有我准备的面试题笔记。
GitHub https://github.com/dtt11111/Nodes 有总结面试完整考点、资料以及我的系列文章。欢迎Star。
在这里插入图片描述

你可能感兴趣的:(Spring,Redis,java,redis,序列化,Springboot,Spring)