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.pswp.cn/bicheng/73379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73379.shtml
英文地址,請注明出處:http://en.pswp.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. 性能優化的關鍵指標…