SpringBoot——》更改Redis序列化方式

推荐链接:

总结------》【Java】

总结------》【Mysql】

总结------》【Redis】

总结------》【Kafka】

总结------》【Spring】

总结------》【SpringBoot】

总结------》【MyBatis、MyBatis-Plus】

总结------》【Linux】

总结------》【MongoDB】

总结------》【Elasticsearch】

SpringBoot------》更改Redis序列化方式

一、序列化方式

  1. GenericJackson2JsonRedisSerializer
  2. GenericToStringSerializer
  3. Jackson2JsonRedisSerializer
  4. JdkSerializationRedisSerializer(默认使用)
  5. StringRedisSerializer
  6. 自定义 Serializer

二、使用默认序列化方式

1、代码示例

java 复制代码
package com.xiaoxian.demo.controller;

import com.alibaba.fastjson.JSON;
import com.xiaoxian.demo.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class RedisTestController {

    @Autowired
    RedisTemplate redisTemplate;


    @GetMapping("/redis/test1")
    public void test1() {
        List<User> list = new ArrayList<>();
        User user = new User();
        user.setId(1);
        user.setName("测试");
        list.add(user);
        redisTemplate.opsForValue().set("strTest1", JSON.toJSONString(list));

        Map<String, Object> map = new HashMap<>(2);
        map.put("id", 1);
        map.put("name", "测试");
        redisTemplate.opsForHash().putAll("mapTest1", map);
    }
}

2、访问接口

http://127.0.0.1:8080/redis/test

3、结果示例


三、更改序列化方式

1、代码示例

java 复制代码
package com.xiaoxian.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class RedisConfig {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // key的序列化方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // value的序列化方式
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        // 创建ObjectMapper对象,基于此对象进行序列化和反序列化
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        //LocalDatetime序列化
        JavaTimeModule timeModule = new JavaTimeModule();
        timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        timeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        timeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

        objectMapper.registerModule(timeModule);

        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        //对象属性值为null时,不进行序列化存储
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        // 更新RedisTemplate对象的默认配置
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

2、访问接口

http://127.0.0.1:8080/redis/test

3、结果示例


四、自定义序列化方式

相关推荐
Jinyi5031 分钟前
Spring Boot 高级配置:如何轻松定义和读取自定义配置
java·spring boot·后端·spring·java-ee·maven·intellij-idea
虫小宝7 分钟前
Spring Boot中的API文档生成
java·spring boot·后端
得不到的更加爱19 分钟前
redis并发、穿透、雪崩
数据库·redis·缓存
虫小宝2 小时前
在Spring Boot中实现多线程任务调度
java·spring boot·spring
多多*11 小时前
每天一道面试题之浅浅讲一下java5中的自动装箱和自动拆箱
java·开发语言·spring boot·后端·spring
cjay_fighting12 小时前
redis7新特性、源码解析
数据库·redis·分布式
hummhumm12 小时前
数据结构第3节: 抽象数据类型
数据结构·spring boot·spring·spring cloud·java-ee·maven·intellij-idea
qxlxi13 小时前
【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat
spring boot·servlet·tomcat
破晓的历程13 小时前
Spring Boot的无缝衔接:深入解析与实践
数据库·spring boot·后端
weixin_teach007x13 小时前
springboot+vue+mybatis图书馆借阅管理系统+PPT+论文+讲解+售后
java·数据库·vue.js·spring boot·mybatis