SpringDataRedis存储Redis的数据序列化

在使用Spring Data Redis存储数据至Redis时,选择合适的序列化策略至关重要。它不仅影响数据存储的效率和空间利用率,还关系到跨语言兼容性和系统的扩展性。适当的序列化方式可以确保数据正确无误地被存储和读取,提升系统的稳定性和维护性,避免由于默认序列化带来的乱码或不兼容问题,从而保障应用的高效运行和数据的安全完整。

目录

序列化介绍

问题解析

问题测试

解决方案

方案一

方案二


序列化介绍

序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在反序列化时,这个过程是相反的,即将这些信息还原成对象。

当你将数据存储到Redis中时,如果发现数据变成字节,这通常与序列化方式有关。指在Java环境中使用Redis客户端,默认情况下会使用JDK内置的序列化方式(即Serializable接口及ObjectOutputStream等类来实现对象的序列化)。

问题解析

兼容性问题:JDK序列化格式是Java特有的,这意味着只有Java程序才能反序列化这些对象。如果你的系统中有非Java组件需要访问Redis中的数据,那么它们将无法直接读取这些序列化的对象。

性能问题:JDK序列化机制有时会比较慢,并且生成的序列化内容可能比其他序列化方法(如JSON, Protobuf, Avro等)更大,从而影响网络传输效率和存储空间。

安全性考虑:反序列化不受信任的数据源可能导致安全漏洞,例如反序列化攻击。这是因为反序列化过程会执行某些代码,如果攻击者能够控制输入流,就可能利用这一点执行恶意代码.

其实可读性也非常差(这谁能看出来name=小明, age=18是上面这一大串

问题测试

使用SpringDataRedis客户端:

创建一个测试的SpringBoot项目,引入依赖:

        <!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

在application.yaml加入:

spring:data:redis:host: localhostport: 6379password:lettuce:pool:max-active: 8min-idle: 0max-idle: 8max-wait: 1000

在测试类,加入以下代码:

@SpringBootTest
class SpringDataRedisDemoApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString() {redisTemplate.opsForValue().set("time","12");Object time = redisTemplate.opsForValue().get("time");System.out.println("time = " + time);}@Testvoid testUser() {redisTemplate.opsForValue().set("user",new User("小明",18));User user = (User) redisTemplate.opsForValue().get("user");System.out.println("user = " + user);}
}

运行后查看Java客户端工具:

解决方案

方案一

配置RedisTemplate,使用JSON作为序列化格式,实现自动序列化和反序列化。

加入下列代码,设置特定的序列化工具(GenericJackson2JsonRedisSerializer

@Configuration
public class RedisConfig {/*** RedisTemplate配置序列化规则* @param connectionFactory* @return*/@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);// 创建Json序列化工具GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置key的序列化规则redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// 设置value的序列化规则redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);return redisTemplate;}
}

修改测试类注入的RedisTemplate类型

    @Autowiredprivate RedisTemplate<String,Object> redisTemplate;

运行结果如下:

可以看到可读性大大提高,可以确保所有存储到Redis中的数据都以一种一致且易于理解的方式进行序列化和反序列化,提升了与Redis交互时的序列化效率、数据兼容性和易用性,使得存储和检索过程更加高效和直观。

方案二

方案一有一个缺点,在储存对象时,把类的class类型写入了JSON结果中,存入Redis,带来了额外的内存开销。(在大量数据的情况下可能给内存带来压力

使用StringRedisTemplate,手动实现序列化和反序列化。

    @Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testUser() throws JsonProcessingException {//创建对象User user = new User("张三", 18);// 手动序列化String json = mapper.writeValueAsString(user);// 存入redisstringRedisTemplate.opsForValue().set("users",json);// 取出数据String users = stringRedisTemplate.opsForValue().get("users");// 手动反序列化User user1 = mapper.readValue(users, User.class);// 输出System.out.println("user1 = " + user1);}

实现效果如下:

实现了去除类的class类型,节省了内存。

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

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

相关文章

交易系统【三】网关

第二章本来是要讲消息总线&#xff0c;审核说是过度宣传&#xff0c;就放弃了&#xff0c;不纠结&#xff0c;先跳过。 网关和消息总线的底层技术都和网络相关&#xff0c;两者也有很重要的差别。消息总线主要用于内网&#xff0c;受交换机和网卡影响比较大&#xff0c;网络状…

eNSP中路由器的CON/AUX接口、GE Combo接口、Mini USB接口、USB接口、WAN侧uplink接口、FE接口、GE接口介绍

路由器常见接口的详细介绍及其应用示例&#xff1a; 1. CON/AUX 接口 全称&#xff1a;Console/Auxiliary&#xff08;控制台/辅助接口&#xff09;作用&#xff1a; CON&#xff08;Console&#xff09;&#xff1a;通过命令行界面&#xff08;CLI&#xff09;直接配置路由器…

iOS底层原理系列04-并发编程

在移动应用开发中&#xff0c;流畅的用户体验至关重要&#xff0c;而并发编程是实现这一目标的关键技术。本文将深入探讨iOS平台上的并发编程和多线程架构&#xff0c;帮助你构建高性能、响应迅速的应用程序。 1. iOS线程调度机制 1.1 线程本质和iOS线程调度机制 线程是操作…

Vmware下的openEuler

1.下载openEuler操作系统镜像 https://repo.openeuler.org/openEuler-20.03-LTS/ISO/ 2.在VM新建虚拟机 3.虚拟机联网 我是出现了没有网络&#xff0c;ping不通的问题 参考&#xff1a;https://blog.csdn.net/FHY26828/article/details/140941234 修改文件&#xff1a; 在…

带宽管理配置实验

一、实验拓扑 配置流程&#xff1a; 1、带宽通道&#xff1a;整体带宽、每个用户带宽、连接数、优先级信息 2、带宽策略 3、策略通道&#xff0c;引用 4、配置接口出入带宽 二、实验需求和配置 1、基础配置 接口配置 [dianxin]interface GigabitEthernet 0/0/0 [dianxin-G…

【STM32】从新建一个工程开始:STM32 新建工程的详细步骤

STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中&#xff0c;下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构&#xff1a;STD_STM…

探索 Trossen AI:从 Aloha到智能机器人平台的进化之路

在人工智能与机器人技术快速发展的当下&#xff0c;科研硬件的性能与成本成为影响行业创新的重要因素。Trossen Robotic为在机器人领域二十余年的知名企业&#xff0c;近日推出的 Trossen AI 系列产品&#xff0c;为科研机构与开发者提供了高性能、高性价比的解决方案。 Trosse…

C语言:5.20程序练习题

打印一个菱形图案。程序分为两部分&#xff1a;上半部分和下半部分。上半部分打印一个逐渐增大的星号图案&#xff0c;下半部分打印一个逐渐缩小的星号图案。 #include<stdio.h> int main() {int row 5;//定义行数int t 2;for (int i row; 0 < i; i--){for (int k…

一些docker命令

一、基础命令 查看 Docker 版本 docker --version 或 docker version&#xff1a;显示 Docker 客户端和服务器的版本信息。 查看 Docker 系统信息 docker info&#xff1a;显示 Docker 系统的详细信息&#xff0c;包括镜像、容器数量、存储驱动类型等。 Docker 服务管理 s…

C语言内容

C语言是一门经典且广泛应用的编程语言&#xff0c;具有以下基础要点&#xff1a; 基本数据类型 包括整型&#xff08;如 int &#xff09;、字符型&#xff08; char &#xff09;、浮点型&#xff08; float 和 double &#xff09;等&#xff0c;用于定义不同类型的变量来…

Python----数据可视化(Pyecharts一:介绍安装,全局配置,系列配置)

一、PyEcharts介绍 1.1、概况 Echarts 是一个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表达力的语言&#xff0c;很适合用于数据处理。当数据分析遇上数据可视化时&#xff…

dockerfile 编写入门

Dockerfile编写指南 Dockerfile是一个文本文件&#xff0c;其中包含了一系列的指令和参数&#xff0c;用于定义如何构建Docker镜像。一个良好编写的Dockerfile不仅可以确保镜像的构建过程高效、可靠&#xff0c;还可以使得镜像更加安全和易于维护。 1. Dockerfile基本结构和语…

Git 本地常见快捷操作

Git 本地常见快捷操作 &#x1f4cc; 1. 基本操作 操作命令初始化 Git 仓库git init查看 Git 状态git status添加所有文件到暂存区git add .添加指定文件git add <file>提交更改git commit -m "提交信息"修改最后一次提交信息git commit --amend -m "新…

如何处理PHP中的文件上传错误

如何处理PHP中的文件上传错误 在Web开发中&#xff0c;文件上传是一个常见的功能需求。然而&#xff0c;文件上传过程中可能会遇到各种错误&#xff0c;如文件大小超出限制、文件类型不被允许、上传过程中断等。为了确保用户能够顺利上传文件&#xff0c;并且开发者能够有效地…

Linux--普通文件的管理

目录 1、创建根目录结构中的所有的普通文件 2、列出所有账号的账号名 3、将/etc/passwd中内容按照冒号隔开的第三个字符从大到小排序后输出所有内容 4、列出/etc/passwd中的第20行-25行内容 head命令 tail命令 5、切割出你的ip地址和mac地址 ip地址 MAC地址 6、切割…

【SpringMVC】常用注解:@RequestBody

1.作用 用于获取请求实体内容&#xff0c;直接使用得到的是keyvalue&keyvalue的数据。获取请求实体内容不适用get请求。 2.属性 required 描述是否有请求体&#xff0c;默认值为true。当取值为true时&#xff0c;get 请求方式会报错。如果取值为false&#xff0c;get请…

RK3588 远程 SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 翻译过来就是 警告&#xff1a;远程主机标识已更改&#xff01; 此报错是由于远程的主机的公钥发生了变化导致的。 ssh服务是通过公钥和私钥来进行连接的&#xff0c;它会把每个曾经访问过计算机或服务器的公钥&#xff…

Go红队开发—web网络编程

文章目录 web网络编程Req快速请求 调试DevModeDebugLogTraceInfo瓶颈分析 控制请求与响应控制请求的字段内容控制调试打印的内容分开dump请求与响应部分请求体设置 作用范围级别设置参数查询URL 路径参数表单请求设置请求头设置 判断响应状态码解析数据SetSuccessResultgjson响…

PawSQL for TDSQL:腾讯云TDSQL数据库性能优化全攻略

TDSQL 作为腾讯云推出的分布式数据库&#xff0c;凭借其高扩展性、高可用性和高性能等优势&#xff0c;广泛应用于金融、互联网、政务等领域。随着业务的不断增长和数据量的爆炸式增长&#xff0c;如何优化 TDSQL 数据库的性能&#xff0c;成为众多企业和开发者面临的挑战。本文…

67.Harmonyos NEXT 图片预览组件之性能优化策略

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 图片预览组件之性能优化策略 文章目录 Harmonyos NEXT 图片预览组件之性能优化策略效果预览一、性能优化概述1. 性能优化的关键指标…