SpringBoot整合Redis实现几种自定义数据序列化存储方式

news2024/11/16 18:02:36

JDK自带序列化方式

在Java中RedisTemplete提供了统一的API来操作Redis,比如插入一条String类型的数据,我可以用
redisTemplate.opsForValue().set("name", "美羊羊");
SpringDataRedis可以接收任何类型的对象并将其转成Redis可以处理的字节,观察这段代码中set()方法的形参列表,发现传进去的key与value都被当作了Java对象Object来处理
在这里插入图片描述
将对象转成字节,这一操作好像和序列化非常相似,看一眼RedisTemplete实现过程,发现针对传入的不同key-value都会有相应的序列化器来操作:
在这里插入图片描述
进去可以看到,在头部定义的几个RedisSerializer类型变量都是null,均需要指定并初始化。
一般按照向set方法里传参的方式则会直接走默认的JDK序列化:
通过一次Debug来简单分析一下
首先,传入的value通过serialize()被转换成了字节数组
在这里插入图片描述
在serialize()方法的内部,则是将value值传入内部的convert()方法
在这里插入图片描述
而在convert()方法的内部则是调用了JDK内部的序列化工具,以流的形式将对象完成序列化
在这里插入图片描述
强制步入serialize()方法后,发现底层就是调用了ObjectoutputStream()来将对象转换成字节写入到Redis中!
但是去查看Redis却发现写入的数据不是以Java端写入的类型存入,而是以序列化的形式存入,并且key与value均被序列化。
在这里插入图片描述
如果这样的话:1.可读性很差2.内存占用大

自定义序列化方式

上述的方式不推荐使用,我们可以人为改变一下RedisTemplete的序列化方式,即封装一个方法,指定key与value序列化的方式,不去使用默认的JDK内部序列化方式
就像这样:

@Configuration
public class ConfigRedis {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        //静态方法 string()
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }

}

其实就是创建一个RedisTemplete实例,并指定四个默认的序列化方式
在这里插入图片描述
主要就是将key序列化成String类型,将Object序列化成JSON类型数据而不是字节
在这里插入图片描述
在这里插入图片描述
并且可以在获取库中的数据时自动反序列化:
User o = (User) redisTemplate.opsForValue().get("user:001");

按照这样的模式,以后根据需要想转换成什么样的序列化方式就可以转成什么样的方式了

最合理的字符串序列化方式

对于我们这些初学者,自动化的方式确实很香(数据量少的情况下),由于实现反序列化时为了知道对象的类型而存在的那串数据:"@class": "com.yu7daily.Pojo.User",乍一看没什么,一旦数据量增多则会占用大量的内存,所以上述方式还是不建议使用
在这里插入图片描述
为了节省内存空间,实际开发中并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。SpringDataRedis提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式
在这里插入图片描述
由于继承了RedisTemplate就不需要再次去定义,直接使用该子类的实例化对象即可:
在这里插入图片描述

就像这样:

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final ObjectMapper mapper = new ObjectMapper();  //JSON工具

    @Test
    void testSaveUser() throws JsonProcessingException {
        // 创建对象
        User user = new User("懒羊羊", 77);
        // 手动序列化
        String json = mapper.writeValueAsString(user);
        // 写入数据
        stringRedisTemplate.opsForValue().set("user:002", json);

        // 获取数据
        String jsonUser = stringRedisTemplate.opsForValue().get("user:002");
        // 手动反序列化
        User user2 = mapper.readValue(jsonUser, User.class);
        System.out.println("user002 = " + user2);
    }

运行测试类,存入对象数据后发现果然没有了“@class”数据
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小布助手,身入大千世界

在2018年—2019年&#xff0c;AI智能助手一度火热&#xff0c;成了科技行业的全新风口。智能音箱与手机中&#xff0c;我们能看到各种各样的智能助手横空出世&#xff0c;一度成为产品标配。但随着时间缓缓冲刷&#xff0c;就像所有科技风口一样&#xff0c;有的AI智能助手随着…

一种非侵入式幂等性的Java实现

今天我们来谈谈什么是幂等性&#xff1f; 引用百度百科的解析如下&#xff1a; 幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同…

3ds Max:标准几何体

三维软件中一般有许多非常复杂的命令&#xff0c;能够完成非常复杂的图形运算&#xff0c;但其实许多绚丽的图形也是由最基本的几何体构成&#xff0c;许多复杂的命令也是基本的运算程序的集合&#xff0c;就像是砖块&#xff0c;构成了复杂的大厦。任何一个几何体&#xff0c;…

【QGIS入门实战精品教程】3.4:QGIS创建、连接、打包GeoPackage数据库及数据入库案例详解

GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。在QGIS中可以很方便的实现GeoPackage的创建与连接等操作。 文章目录 一、QGIS创建GeoPackage1. 创建数据库2. 数据入库二、矢量数据打包为GeoPackage1. 加载shp文件2. 使用QGIS打包图…

微信键盘好用吗?

相信大家在手机上已经安装了一款自己比较熟练使用地输入法&#xff0c;最近微信推出了微信键盘&#xff0c;作为一名产品经理&#xff0c;当然不能错过试用它&#xff0c;我在第一时间下载进行了使用&#xff0c; 下面是我使用了几天的感受&#xff0c;与大家分享一下。 一、体…

2023年5大网络安全趋势加速发展

©网络研究院 Netwrix发布了2023年将影响各种规模组织的关键网络安全趋势。以下是你需要注意的五个具体趋势: 网络犯罪的业务将进一步专业化 Emotet、Conti和Trickbot等恶意软件的回归表明网络雇佣犯罪的扩张。特别是&#xff0c;勒索软件即服务的增长使没有深厚技术技能…

VSCode 最全实用插件

一、必备插件 &#x1f33e;Chinese&#xff08;中文&#xff09; Settings Sync&#xff08;配置同步到云端&#xff09; 可以让我们的vscode配置同步到云端&#xff0c;当我们跟换电脑或者再次安装vscode的时候&#xff0c;只需要登录账号即可同步配置了 wakatime&#xf…

Linux_日志

1.日志的介绍 1.日志文件是重要的系统信息文件 ,其中记录了许多重要的系统事件,包括用户的登录信息、系统的 启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等。 2.日志对于安全来说也很重要 &#xff0c;它记录了系统每天发生的各种事情,通过日志来检查错误发生的…

Golang 【basic_leaming】3 流程控制

阅读目录Go 语言 if else (条件判断)Go 语言 if else 条件判断代码示例if 的特殊写法Go 语言 for&#xff08;循环&#xff09;for 循环 - 初始语句for 循环 - 条件表达式1 更美观的死循环写法2 只有一个条件的 for 循环for 循环 - 结束语句Go 语言 for range (键值循环)for ra…

前端自动化测试精讲

单元测试 端对端测试 持续集成方案&#xff0c;在项目中落地前端自动化测试 作者介绍 祯民&#xff0c;字节跳动前端开发工程师&#xff0c;掘金小册《SSR实战&#xff1a;官网开发指南》作者&#xff0c;公众号「祯民讲前端」作者。曾负责 抖音前端技术团队官网 和 字节官网…

RV1126笔记十二:实现RTMP单路拉流

若该文为原创文章,转载请注明原文出处。 一、介绍 相比推流,拉流就简单了一点,只需要连接RTMP服务器,获取流,把数据解码出来显示和播放就可以,使用的是易百纳板子,测试时音频输出是不正常的,所以只解析了视数据,不处理音频。如果想测试音频,建议用其他开发板,正点…

TikTok 加速团结独立站,跨境电商的又一次红利期?

TikTok近年来在国际上非常流行。2021年8月&#xff0c;TikTok的全球下载量首次超过Facebook&#xff0c;成为全球最大的下载量。TikTok的诞生打破了海外社交媒体的垄断&#xff0c;TikTok营销成为许多跨境卖家的重点之一。 封号事件发生后&#xff0c;许多跨境卖家开始向独立站…

我的周刊(第071期)

我的信息周刊&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目Free-TVUrl-Merge[1]免费 TvBox 影视站聚合&#xf…

H7068 DIGITAL SYSTEMS AND MICROPROCESSOR DESIGN: COURSEWORK 2022 verilog-仿真

内容: 给cpubank写testbench: 1.the testbench have test a variety of operations the sequence described: i) Reset: The test bench should first reset the register bank. The reset is synchronous. It should also set rrd1, rrd2, d, rwr, rwren to zero. ii) Stor…

自然语言处理NLP——图神经网络与图注意力模型(GNN、GCN、GAT)

目录 系列文章目录 一、图神经网络 1.图与图嵌入 2.GNN动机 2.1 CNN的缺陷与非结构性数据 2.2 图嵌入的缺陷 3.GNN详解 3.1 GNN简介 3.2 GNN模型 3.3 GNN框架 3.4 GNN局限与优化 二、图卷积神经网络 1.卷积 2.GCN详解 2.1 GCN动机 2.2 GCN简介 2.3 GCN思想与模…

前端(htmlCSSJavaScript)基础

关于前端更多知识请关注官网&#xff1a;w3school 在线教程全球最大的中文 Web 技术教程。https://www.w3school.com.cn/ 1.HTML HTML(HyperText Markup Language)&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息…

Xcode 如何在 silicon Mac 上调试 iOS 版本的 App

功能需求 自从 M1 处理器 Mac 推出以后,我们可以用原生方式在 silicon Mac 系统上运行 iPhone 或 iPad 上的 App。 然而,当发现上架后的 iPhone / iPad App 在 silicon Mac 上运行表现异常时,我们如何在 Xcode 中调试它们呢?比如:在 silicon Mac 中 SwiftUI 弹出的 shee…

跳表Skiplist

介绍 对于有n个元素的链表&#xff0c;会分成log(n1)&#xff0c;比如下图为四层&#xff0c;最下面是所有元素都有&#xff0c;往上面走隔着空元素越来越少&#xff0c;保证查询效率为logn 如何插入元素&#xff1a; 最关键的就是新插入的节点应该跨越多少层**——>由抛硬…

解析 Navicat 最受欢迎的功能 | SQL 查询编辑器与 SQL 创建工具

近期发起的线上投票调查中&#xff0c;我们很高兴地看到&#xff1a;SQL 查询编辑器、SQL 创建工具已成为用户最常用的功能之一&#xff0c;并且深受用户欢迎&#xff01;在人类社会发展的历史长河中&#xff0c;离不开工具的演进与发展。而 Navicat 作为领先的数据库管理开发工…

setContentView学习(一)

setContentView流程分两种情况,一种是继承自Activity的情况,另一种是继承自AppCompatActivity的情况&#xff0c;下面分别介绍。 先说继承自Activity的情况&#xff0c;源码为android-30 public class Activity extends ContextThemeWrapper {public void setContentView(Lay…