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、结果示例


四、自定义序列化方式

相关推荐
vx-程序开发3 小时前
【计算机毕设】51300童装超市管理系统的设计与实现
java·vue.js·spring boot·源码·课程设计·毕设·大作业
ym hyd 1113 小时前
题库建立与考试系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·vue.js·spring boot·毕设
ShineWinsu3 小时前
对于Redis:事务的解析
数据库·redis·mysql·缓存·面试·事务·acid
萧瑟余晖5 小时前
Spring Boot Starter机制与自定义详解
spring boot
夕除5 小时前
redis--OpenResty
java·redis
vx-程序开发5 小时前
【计算机毕设】52744基于微信小程序的民宿智能预订系统
java·spring boot·毕业设计·源码·课程设计·毕设·大作业
萧瑟余晖5 小时前
Spring Boot 配置体系详解
spring boot
专业程序开发源6 小时前
springboot古城景区管理系统88564-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
小蒜学长6 小时前
基于微信小程序的遇见咖啡店点餐系统设计与实现(代码+数据库+LW)
java·spring boot·后端·微信小程序·咖啡店点餐系统
小蒜学长7 小时前
基于SSM+VUE的电影售票平台的设计与实现(代码+数据库+LW)
java·vue.js·spring boot·后端·ssm框架·电影售票平台