我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot怎么结合Redis实现序列化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot怎么结合Redis实现序列化

这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。

配置类

配置 Jackson2JsonRedisSerializer 序列化策略

下面就开始自动配置类的书写

我使用的是 Jackson2JsonRedisSerializer 来对对象进行序列化,所以首先需要一个方法,来配置 Jackson2JsonRedisSerializer 序列化策略

private Jackson2JsonRedisSerializer<Object> serializer() {        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);        ObjectMapper objectMapper = new ObjectMapper();        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        return jackson2JsonRedisSerializer;    }

这里要注意的是

objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

这一句,这一句非常的重要,作用是序列化时将对象全类名一起保存下来

设置之后的序列化结果如下:

[
    "com.buguagaoshu.redis.model.User",
    {
        "name": "1",
        "age": "11",
        "message": "牛逼"
    }
]

不设置的话,序列化结果如下,将无法反序列化

{
        "name": "1",
        "age": "11",
        "message": "牛逼"
    }

一开始,我在网上搜了一下,发现大多数教程因为时间的原因,这一句用的是

objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

但当我把这段代码写入的时候,发现Idea提示我

SpringBoot怎么结合Redis实现序列化

着是一个过时的方法,由于我当时并不知道这句话的意思,就把这段代码注释了,觉得可能没什么用,但注释后在向Redis里写数据的时候,数据会变成

SpringBoot怎么结合Redis实现序列化

SpringBoot怎么结合Redis实现序列化

导致数据无法反序列化。

最后我查看了这个方法的源码,找到了

SpringBoot怎么结合Redis实现序列化

SpringBoot怎么结合Redis实现序列化

通过注释,我得到了这段代码的最新写法。

也明白了这段代码的作用。

配置  RedisTemplate

@Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        redisTemplate.setValueSerializer(serializer());        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // 使用StringRedisSerializer来序列化和反序列化redis的key值        redisTemplate.setKeySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // hash的value序列化方式采用jackson        redisTemplate.setHashValueSerializer(serializer());        redisTemplate.afterPropertiesSet();        return redisTemplate;    }

这里就没有什么需要注意的了,按照自己的需求,来配置序列化的方式

配置缓存策略

@Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        // 配置序列化(解决乱码的问题)        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                // 缓存有效期                .entryTtl(timeToLive)                // 使用StringRedisSerializer来序列化和反序列化redis的key值                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))                // 禁用空值                .disableCachingNullValues();        return RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();    }

测试代码

@SpringBootTestpublic class RedisApplicationTests {    @Autowired    private RedisTemplate<String, Object> redisTemplate;    @Test    void contextLoads() throws Exception {        User user = new User();        user.setName("15");        user.setAge(20);        user.setMessage("牛逼");        redisTemplate.opsForValue().set(user.getName(), user);        User getUser = (User) redisTemplate.opsForValue().get(user.getName());        System.out.println(getUser);        System.out.println(getUser.getMessage());    }}

再来查看Redis中的数据

SpringBoot怎么结合Redis实现序列化

数据正常,并且系统也能正常的反序列化了。

完整代码

package com.buguagaoshu.redis.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;import org.springframework.beans.factory.annotation.Value;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;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.RedisSerializationContext;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    @Value("${spring.cache.redis.time-to-live}")    private Duration timeToLive = Duration.ZERO;        private Jackson2JsonRedisSerializer<Object> serializer() {        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);        ObjectMapper objectMapper = new ObjectMapper();        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        return jackson2JsonRedisSerializer;    }    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        redisTemplate.setValueSerializer(serializer());        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // 使用StringRedisSerializer来序列化和反序列化redis的key值        redisTemplate.setKeySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // hash的value序列化方式采用jackson        redisTemplate.setHashValueSerializer(serializer());        redisTemplate.afterPropertiesSet();        return redisTemplate;    }    @Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        // 配置序列化(解决乱码的问题)        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                // 缓存有效期                .entryTtl(timeToLive)                // 使用StringRedisSerializer来序列化和反序列化redis的key值                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))                // 禁用空值                .disableCachingNullValues();        return RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();    }}

关于“SpringBoot怎么结合Redis实现序列化”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringBoot怎么结合Redis实现序列化”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot怎么结合Redis实现序列化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot怎么结合Redis实现序列化

这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。配置类配置
2023-07-02

SpringBoot怎么整合Redis实现序列化存储Java对象

今天小编给大家分享一下SpringBoot怎么整合Redis实现序列化存储Java对象的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解
2023-07-05

SpringBoot怎么自定义Redis实现缓存序列化

本篇内容主要讲解“SpringBoot怎么自定义Redis实现缓存序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么自定义Redis实现缓存序列化”吧!1、自定义Red
2023-07-02

redis json序列化怎么实现

RedisJSON序列化Redis提供JSON序列化功能,允许以JSON格式存储和检索数据,简化复杂数据结构的处理、提高性能。实现步骤启用JSON模块序列化数据为JSON获取JSON数据查询JSON数据修改JSON数据删除JSON数据优势存储复杂数据结构提高性能简化数据处理提高可扩展性与其他语言兼容
redis json序列化怎么实现
2024-04-08

Redis持久化与序列化怎么实现

Redis持久化和序列化是两个不同的概念,它们分别用于将数据保存到磁盘上以及将数据转换成字节流进行传输。Redis持久化可以通过两种方式来实现:RDB持久化和AOF持久化。RDB持久化是将数据保存到磁盘上的快照文件中,可以通过配置文件设置
Redis持久化与序列化怎么实现
2024-04-29

SpringBoot整合Redis实现序列化存储Java对象的操作方法

目录一、背景1、思考2、方案二、源码分析三、注入RedisTemplate1、引入依赖2、Redis 连接信息3、Redis 核心配置类4、Redis工具类四、测试1、创建 Java 实体类 UserInfo2、测试用例3、测试结果之前介绍
2023-03-23

golang结构体序列化怎么实现

在Go中,可以使用encoding/json包来实现结构体的序列化和反序列化。首先,需要导入encoding/json包:import "encoding/json"然后,定义一个结构体类型,例如:type Person struc
2023-10-22

Redis中的消息队列序列化怎么实现

在Redis中实现消息队列序列化可以使用各种不同的方法,其中一种常见的方法是使用JSON序列化。可以将消息数据转换为JSON格式存储在Redis中,并在需要时将其反序列化为原始数据格式。以下是一个简单的示例代码,演示如何在Python中使
Redis中的消息队列序列化怎么实现
2024-04-29

redis怎么序列化

redis根据数据类型自动选择不同的序列化方式:字符串数据类型:resp(文本协议)哈希数据类型:rdb(二进制格式)位图和有序集合数据类型:sds(二进制格式)geo数据类型:geo序列化器stream数据类型:stream序列化器Red
redis怎么序列化
2024-05-21

springboot序列化和反序列化怎么定义

在Spring Boot中,序列化和反序列化可以通过以下方式进行定义:1. 实现Serializable接口:在需要进行序列化和反序列化的类中,实现Serializable接口。这是Java提供的一种序列化和反序列化的机制,通过实现该接口,
2023-08-14

怎么用Protobuf与Redis实现高效序列化

要使用 Protobuf 与 Redis 实现高效序列化,可以按照以下步骤进行:定义 Protobuf 消息类型:首先需要定义要序列化的数据结构,并使用 Protobuf 协议定义消息类型。例如,可以创建一个 .proto 文件来定义消息类
怎么用Protobuf与Redis实现高效序列化
2024-04-29

Java序列化与反序列化怎么实现

本篇内容主要讲解“Java序列化与反序列化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java序列化与反序列化怎么实现”吧!序列化与反序列化概念序列化 (Serialization)是
2023-06-02

redis怎么实现并列排序

Redis可以通过有序集合(Sorted Set)来实现并列排序。有序集合是一种特殊的数据结构,其中的每个成员都关联着一个分数(score),并且集合中的成员根据分数进行排序。在有序集合中,成员是唯一的,但是分数可以重复。要实现并列排序,可
2023-09-06

PHP与Redis序列化会话存储怎么实现

在PHP中,可以使用Redis作为会话存储的后端,以实现会话持久化和共享。为了实现这个目标,可以使用PHP的Redis扩展来连接到Redis服务器,并使用Redis中的set和get命令来读取和存储会话数据。在将会话数据存储到Redis中
PHP与Redis序列化会话存储怎么实现
2024-04-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录