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


四、自定义序列化方式

相关推荐
万物皆字节20 分钟前
Springboot3 自动装配流程与核心文件:imports文件
spring boot
问道飞鱼23 分钟前
【Springboot知识】Springboot结合redis实现分布式锁
spring boot·redis·分布式
码明24 分钟前
SpringBoot整合ssm——图书管理系统
java·spring boot·spring
小金的学习笔记41 分钟前
RedisTemplate和Redisson的使用和区别
数据库·redis·缓存
取址执行43 分钟前
Redis发布订阅
java·redis·bootstrap
呼啦啦啦啦啦啦啦啦1 小时前
【Redis】事务
数据库·redis·缓存
荆州克莱1 小时前
微信小程序获取位置服务
spring boot·spring·spring cloud·css3·技术
赵相机-2 小时前
Spring集成Redis|通用Redis工具类
spring boot·redis·spring
书生-w2 小时前
Redis Windows 解压版安装
数据库·windows·redis
猿小飞2 小时前
redis 5.0版本和Redis 7.0.15的区别在哪里
数据库·redis·缓存