Redis Java 客戶端 之 SpringDataRedis

SpringDataRedis

SpringData是Spring中數據操作的模塊,包含對各種數據庫的集成,其中對Redis集成模塊就叫做SpringDataRedis,
官方地址:https://spring.io/projects/spring-data-redis

特性:

  • 提供了對不同Redis客戶端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate統一API來操作Redis
  • 支持Redis的發布訂閱模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的響應式變成
  • 支持基于JDK、JSON、字符串、Spring對象的數據序列化及反序列化
  • 支持基于Redis的JDK Collection實現

在這里插入圖片描述

文章目錄

  • SpringDataRedis
    • 一、SpringDataRedis快速入門
      • 1.引入依賴
      • 2.配置文件
      • 3.注入RedisTemplate
      • 4.編寫測試
    • 二、SpringDataRedis的序列化方式
      • RedisTemplate序列化器源碼分析
      • 方式一:自定義RedisTemplate的序列化方式
        • 編寫RedisTemplate序列化器的配置
      • 方式二: StringRedisTemplate
        • 1. 依賴注入
        • 2. 編寫測試

一、SpringDataRedis快速入門

API返回值類型說明
redisTemplate.opsForValue()ValueOperations操作String類型數據
redisTemplate.opsForHashHashOperations操作Hash類型數據
redisTemplate.opsForListListOperations操作List類型數據
redisTemplate.opsForSetSetOperations操作Set類型數據
redisTemplate.opsForZSetZSetOperations操作SortedSet類型數據
redisTemplate通用的命令

1.引入依賴

	<!-- Redis依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 連接池依賴 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!-- Jackson依賴(如果使用了SpringMVC則無需引入) --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency> 

2.配置文件

spring:redis:host: 127.0.0.1port: 6379password:database: 2lettuce:pool: # 默認使用lettuce連接池,如需切換為jedis,請注釋掉此部分,并加入對jedis的依賴max-active: 8 # 最大連接數max-idle: 8 # 最大空閑連接數min-idle: 0 # 最小空閑連接數max-wait: 1000 # 最大等待時間

3.注入RedisTemplate

	@Autowiredprivate RedisTemplate<String, String> redisTemplate;

4.編寫測試

    @Testvoid testString() {// 寫入一條String數據redisTemplate.opsForValue().set("name", "查理布朗");// 獲取String數據String name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);}

二、SpringDataRedis的序列化方式

當自動注入寫作@Autowired private RedisTemplate redisTemplate;時,

未指定RedisTemplate<K, V>的key和value類型,默認key和value都為Object,寫入redis時redisTemplate會根據RedisSerializer自動完成對象的序列化操作(默認使用JdkSerializationRedisSerializer完成對對象的序列化操作),

因此會存在:當key和value為String時,存入的key和value顯示亂碼(修改為String序列化器后即可恢復正常)

在這里插入圖片描述

可讀性差、內存占用較大

在這里插入圖片描述


RedisTemplate序列化器源碼分析

RedisTemplate可以接收任意Object作為值寫入Redis,寫入前會把Object通過不同的RedisSerializer序列化為字節形式。

如果 keyvaluiehashKeyhashValue的序列化器沒有初始值,則會使用默認序列化器defaultSerializer

RedisTemplate.java

RedisTemplate.java源碼中,我們可以看到默認的序列化器defaultSerializerJdkSerializationRedisSerializer

RedisTemplate.java

通過對redisTemplate.opsForValue().set("name", "查理布朗")set方法debug,底層使用ObjectOutPutStream將Java對象寫為字節后存入Redis

在這里插入圖片描述


方式一:自定義RedisTemplate的序列化方式

  1. 自定義RedisTemplate
  2. 修改RedisTemplate的序列化器為GenericJackson2JsonRedisSerializer
編寫RedisTemplate序列化器的配置
@Configuration
public class RedisConfig {@Beanpublic 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());template.setHashKeySerializer(RedisSerializer.string());// 設置Value的序列化器template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}}

盡管Json的序列化方式可以滿足我們的需求,但依然存在一些問題,如圖:

在這里插入圖片描述

為了在反序列化時直到對象的類型,JSON序列化器會將類的class類型寫入json結果中,存入Redis,會帶來額外的內存開銷。

為了節省內存空間,我們并不會使用JSON序列化器來處理value,而是統一使用String序列化器,要求只能存儲String類型的key和value。當需要存儲Java對象時,手動完成對象的序列化和反序列化。

方式二: StringRedisTemplate

  1. 使用StringRedisTemplate
  2. 寫入Redis時,手動把對血啊ing序列化為JSON
  3. 讀取Redis時,手動把讀取到的JSON反序列化為對象

在Spring中,默認提供了一個StringRedisTemplate類,它的key和value的序列化方式默認都是String方式。省去了我們自定義RedisTemplate的過程:

1. 依賴注入
	@Autowiredprivate StringRedisTemplate stringRedisTemplate;
2. 編寫測試
	import com.fasterxml.jackson.databind.ObjectMapper;// JSON工具private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testStringTemplate() throws JsonProcessingException {// 準備對象User user = new User("查理二世", 30);// 手動序列化String json = mapper.writeValueAsString(user);// 寫入到redisstringRedisTemplate.opsForValue().set("user:200", json);// 讀取數據String val = stringRedisTemplate.opsForValue().get("user:200");// 反序列化User user1 = mapper.readValue(val, User.class);System.out.println("user1 = " + user1);}@Testvoid testHash() {// 寫入數據stringRedisTemplate.opsForHash().put("user:400", "name", "查理三世");stringRedisTemplate.opsForHash().put("user:400", "age", "40");// 獲取數據Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");System.out.println("entries = " + entries); // entries = {name=查理三世, age=40}}

該方式消除了@class,節約了存儲空間。
在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76284.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字化轉型:重構生存邏輯,不止系統升級

數字化轉型不過是升級系統&#xff0c;砸了錢、耗了力&#xff0c;卻沒達到預期&#xff0c;競爭力也沒提升。實際上&#xff0c;數字化轉型是對企業生存邏輯的徹~底重構&#xff0c;關乎商業模式、運營流程等方方面面。? 很多企業覺得數字化轉型是 IT 部門的事&#xff0c;只…

C語言隊列的實現

目錄 ?編輯 &#xff08;一&#xff09;隊列的定義,初始化及創建結點 &#xff08;二&#xff09;入隊和出隊&#xff0c;以及取隊頭隊尾的數據 (三)銷毀隊列 隊列是指只允許在一端進行插入數據操作&#xff0c;在另?端進行刪除數據操作的特殊線性表&#xff0c;隊列具有先…

mapbox進階,使用本地dem數據,加載hillshade山體陰影圖層

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??hillshade 山體陰影圖層 api1.3.1 ??…

量子糾錯碼實戰:從Shor碼到表面碼

引言&#xff1a;量子糾錯的必要性 量子比特的脆弱性導致其易受退相干和噪聲影響&#xff0c;單量子門錯誤率通常在10?~10?量級。量子糾錯碼&#xff08;QEC&#xff09;通過冗余編碼測量校正的機制&#xff0c;將邏輯量子比特的錯誤率降低到可容忍水平。本文從首個量子糾錯…

10. git switch

基本概述 git switch是 Git 2.23 版本之后新增的命令&#xff0c;專門用于切換分支&#xff0c;目的是替代 git checkout 中與分支操作相關的功能&#xff0c;使命令語義更清晰、更安全。 基本用法 1.切換到已有分支 git switch <branch-name>常用選項 1.從當前分支…

LeetCode 熱題 100 堆

215. 數組中的第K個最大元素 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 **k** 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實現時間復雜度為 O(n) 的算法解決此問題。 示例 …

PIXOR:基于LiDAR的3D檢測模型解析

目錄 1、前言 2、PIXOR介紹 2.1. 什么是PIXOR&#xff1f; 2.2. PIXOR如何工作&#xff1f; 3、表現和應用 3.1、PIXOR的性能表現 3.2、PIXOR的應用場景 3.3、PIXOR的局限性與挑戰 4. PIXOR的未來展望 5. 結語 1、前言 自動駕駛技術正以前所未有的速度發展&#xff…

Vue中權限控制的方案

文章目錄 源碼&#xff1a;一、頁面級1.1、路由守衛1.2、動態路由 二、按鈕級別2.1、通過v-if來判斷2.2、通過組件包裹的方式來判斷2.3、通過自定義指令的方式 三、接口級別 源碼&#xff1a; https://gitee.com/liu-qiang-yyds/sysPermission 一、頁面級 1.1、路由守衛 前端…

【OSG學習筆記】Day 1: OSG初探——環境搭建與第一個3D窗口

什么是 OSG&#xff1f; 全稱&#xff1a;OpenSceneGraph&#xff08;開源場景圖&#xff09; 定位&#xff1a;一個基于 C/OpenGL 的高性能開源3D圖形開發工具包&#xff0c;專注于實時渲染和復雜場景管理。 核心思想&#xff1a;通過 場景圖&#xff08;Scene Graph&#xf…

Kubernetes 入門篇之網絡插件 calico 部署與安裝

在運行kubeadm init 和 join 命令部署好master和node節點后&#xff0c;kubectl get nodes 看到節點都是NotReady狀態&#xff0c;這是因為沒有安裝CNI網絡插件。 kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Not…

游戲開發中 C#、Python 和 C++ 的比較

&#x1f3ac; Verdure陌矣&#xff1a;個人主頁 &#x1f389; 個人專欄: 《C/C》 | 《轉載or娛樂》 &#x1f33e; 種完麥子往南走&#xff0c; 感謝您的點贊、關注、評論、收藏、是對我最大的認可和支持&#xff01;?? 摘要&#xff1a; 那么哪種編程語言最適合游戲開發…

LabVIEW真空度監測與控制系統

開發了一種基于LabVIEW的真空度信號采集與管理系統&#xff0c;該系統通過圖形化編程語言實現了真空度的高精度測量和控制。利用LabVIEW的強大功能&#xff0c;研制了相應的硬件并設計了完整的軟件解決方案&#xff0c;以滿足工業應用中對真空度監測的精確要求。 項目背景 隨著…

checkra1n越獄出現的USB error -10問題解決

使用checkra1n進行越獄是出現&#xff1a; 解決辦法(使用命令行進行越獄)&#xff1a; 1. cd /Applications/checkra1n.app/Contents/MacOS 2. ./checkra1n -cv 3. 先進入恢復模式 a .可使用愛思助手 b. 或者長按home,出現關機的滑條&#xff0c;同時按住home和電源鍵&#…

spring boot 中 WebClient 與 RestTemplate 的對比總結

以下是 WebClient 與 RestTemplate 的對比總結&#xff0c;以純文本表格形式呈現&#xff1a; 核心特性對比 特性RestTemplateWebClient線程模型同步阻塞&#xff1a;每個請求占用線程&#xff0c;直到響應返回。異步非阻塞&#xff1a;基于事件循環&#xff0c;高效處理高并發…

深入淺出SPI通信協議與STM32實戰應用(W25Q128驅動)(實戰部分)

1. W25Q128簡介 W25Q128 是Winbond推出的128M-bit&#xff08;16MB&#xff09;SPI接口Flash存儲器&#xff0c;支持標準SPI、Dual-SPI和Quad-SPI模式。關鍵特性&#xff1a; 工作電壓&#xff1a;2.7V~3.6V分頁結構&#xff1a;256頁/塊&#xff0c;每塊16KB&#xff0c;共1…

STM32 HAL庫之EXTI示例代碼

外部中斷按鍵控制LED燈 在main.c中 HAL_Init(); 初始化Flash&#xff0c;中斷優先級以及HAL_MspInit函數&#xff0c;也就是 stm32f1xx_hal.c 中 HAL_StatusTypeDef HAL_Init(void) {/* Configure Flash prefetch */ #if (PREFETCH_ENABLE ! 0) #if defined(STM32F101x6) || …

查看手機在線狀態,保障設備安全運行

手機作為人們日常生活中不可或缺的工具&#xff0c;承載著溝通、工作、娛樂等多種功能。保障手機設備的安全運行是我們每個人都非常重要的任務&#xff0c;而了解手機的在線狀態則是其中的一環。通過挖數據平臺提供的在線查詢工具&#xff0c;我們可以方便快捷地查詢手機號的在…

Llama 4全面評測:官方數據亮眼,社區測試顯不足之處

引言 2025年4月&#xff0c;Meta正式發布了全新的Llama 4系列模型&#xff0c;這標志著Llama生態系統進入了一個全新的時代。Llama 4不僅是Meta首個原生多模態模型&#xff0c;還采用了混合專家(MoE)架構&#xff0c;并提供了前所未有的上下文長度支持。本文將詳細介紹Llama 4…

淘寶API驅動跨境選品:多語言詳情頁自動翻譯與本地化定價

淘寶 API 驅動跨境選品實現多語言詳情頁自動翻譯與本地化定價&#xff0c;為跨境電商業務帶來諸多便利與優勢&#xff0c;以下是詳細介紹&#xff1a; 一、多語言詳情頁自動翻譯 技術原理 借助淘寶的 API 接口&#xff0c;獲取商品詳情頁的各類文本信息&#xff0c;包括標題、描…

MFC工具欄CToolBar從專家到小白

CToolBar m_wndTool; //創建控件 m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC); //加載工具欄資源 m_wndTool.LoadToolBar(IDR_TOOL_LOAD) //在.rc中定義&#xff1a;IDR_TOOL_LOAD BITMAP …