Redis基礎(6):SpringDataRedis

SpringDataRedis簡介

SpringDataSpring中專門進行數據操作的模塊,包含了對于各種數據庫的集成。其中對Redis的集成模塊叫做SpringDataRedis(官網地址:Spring Data Redis)。其最核心的特點就是提供了不同Redis客戶端的整合:結合了JedisLettuce提供了RedisTemplate這個統一的操作模板來操作Redis,下圖是SpringDataRedis的其他特點:
在這里插入圖片描述

由于Spring系列的強大生態支持,和SpringDataRedis本身優秀的使用體驗,現在越來越多的企業傾向于使用SpringDataRedis作為RedisJava客戶端,同時本人也推薦大家使用SpringDataRedis

SpringDataRedis快速入門

引入依賴

我們使用SpringBoot框架來進行SpringBootRedis的快速入門。由于SpringBoot已經提供了對SpringDataRedis的支持(可以在創建SpringBoot項目的時候將SpringDataRedis的依賴引入到pom.xml文件中),所以說使用起來非常的簡單,如果沒有在創建項目時引入依賴,也可以進行手動引入,在引入時不但需要SpringDataRedis的依賴,還需要一個連接池依賴來實現連接池(commons-pool2):

<!-- SpringDataRedis依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.4.6</version>
</dependency>
<!-- 連接池依賴 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.12.0</version>
</dependency>

配置文件

因為我們使用了SpringBoot框架,所以說對于Redis連接的配置我們可以直接基于application文件進行配置:

spring:data:redis:host: 192.168.181.134port: 6379password: your password# 連接池配置lettuce:pool:max-active: 8 # 最大連接數max-idle: 8 # 最大空閑連接min-idle: 4 # 最小空閑連接max-wait: 1000ms # 連接等待時間

在配置連接池的時候需要特別注意,可以使用JedisLettuce兩個連接池: 在這里插入圖片描述
Spring默認使用的是Lettuce連接池,可以從Maven依賴傳遞中看出:
在這里插入圖片描述

而我們并沒有引入Jedis的依賴,所以說在配置連接池的時候使用Lettuce即可,如果想要使用Jedis連接池,則需要引入對應的依賴。

編碼操作

上文提到了SpringDataRedis提供了一個RedisTemplate這個統一的操作模板來操作Redis,所以說想要使用SpringDataRedis只需要學會RedisTemplate即可RedisTemplate中封裝了各種對于Redis的操作,并且將不同數據類型的操作API封裝到了不同的類型中:
在這里插入圖片描述

下面是一個簡單的RedisTemplate操作示例:

package com.wzb;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;@SpringBootTest
class RedisSpringDataApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString() {// 存儲一條String數據redisTemplate.opsForValue().set("name", "jack");// 獲取String數據Object name = redisTemplate.opsForValue().get("name");System.out.println(name);}}

這是一個SpringBoot的測試類,其中通過@Autowired注解注入了RedisTemplate,然后在測試方法中,通過opsForValue來操作String類型的數據,并且通過set方法存入一條KeynameValuejack的數據。但是這樣存入數據之后,我們是無法正常讀取的,讓我們通過可視化界面查看一下剛才存入的數據:
在這里插入圖片描述
在這里插入圖片描述

我們可以看到在我們原本的Key:name之間有一大串字符,在原本的Value:jack之前也有一大串字符。這是因為RedisTemplate在存入數據之前需要將數據序列化,而默認的序列化器是JdkSerializationRedisSerializer也就是JDK的默認序列化器,該序列化器會將Java對象轉換為Java標準的二進制序列化,而那些十六進制的特殊字符是JDK序列化的魔法數。這樣的狀況顯然不是我們想看到的,因為這樣的話存入的Key-Value的值完全被改變了,無法直接進行讀取或修改,此時,就需要配置RedisTemplate的序列化器。

配置RedisTemplate的序列化器

在這里插入圖片描述

通過觀察RedisTemplate的源代碼發現,RedisTemplate一共可以支持4個序列化器的配置,并且由于這4個序列化器的配置都是null,所以說會使用默認的JdkSerializationRedisSerializer序列化器。可供選擇的Serializer如圖所示:
在這里插入圖片描述
在這里插入圖片描述

一般對于Key的序列化會使用StringRedisSerializer,而Value的序列化器使用 genericJackson2JsonRedisSerializer這個序列化器會將Java對象轉為Json字符串然后再存儲到Redis中。
我們可以創建一個類來完成RedisTemplate的序列化器配置:

package com.wzb.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;/*** Redis序列化設置*/
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 創建RedisTemplate對象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// 設置連接工廠redisTemplate.setConnectionFactory(redisConnectionFactory);// 創建Json序列化工具GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 設置Key序列化redisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setHashKeySerializer(RedisSerializer.string());// 設置Value序列化redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);// 返回return redisTemplate;}}

想要使用genericJackson2JsonRedisSerializer序列化器還需要引入Json相關依賴:

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

然后就可以修改原來代碼,注入我們自定義序列化器的RedisTemplate

@Autowired
private RedisTemplate<String, Object> redisTemplate;

測試之后發現,存入的數據是我們想要的結果:
在這里插入圖片描述

然后測試存入一個Java對象:

@Test
void testObject() {redisTemplate.opsForValue().set("user", new User("zhangsan", 20));User user = (User)redisTemplate.opsForValue().get("user");System.out.println(user);
}

在這里插入圖片描述
在這里插入圖片描述

發現存取都是沒有問題的,更換RedisTemplate序列化器成功。

StringRedisTemplate

在使用genericJackson2JsonRedisSerializer序列化器存儲一個Java對象時,除了對象的屬性外,還會存儲這個類的全類名以便于反序列化。這樣看似很方便,但實際上存在一個很大的問題:耗費了太多的額外存儲空間。因為Redis是基于內存的,眾所周知,內存是十分寶貴的,所以說要盡量高效地使用內存,將全類名存入Redis是不推薦的做法。
解決方法就是對于Value,也使用和Key一樣的StringRedisSerializer序列化器,Value當作String類型進行處理,然后在Java代碼中通過程序手動序列化和反序列化Spring早就為我們考慮到了這一點,于是提供了一個StringRedisTemplate工具,其KeyValue的序列化器就是StringRedisSerializer

在這里插入圖片描述
我們就可以使用StringRedisTemplate來操作,而無需自己去設置序列化器:

package com.wzb;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wzb.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;import java.util.Map;@SpringBootTest
public class StringRedisTemplateTests {@Autowiredprivate StringRedisTemplate stringRedisTemplate;private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testSave() throws JsonProcessingException {// 創建對象User user = new User("lisi", 25);// 手動序列化String json = mapper.writeValueAsString(user);// 寫入數據stringRedisTemplate.opsForValue().set("user", json);// 獲取數據String jsonUser = stringRedisTemplate.opsForValue().get("user");// 手動反序列化User readUser = mapper.readValue(jsonUser, User.class);System.out.println(readUser);}}

使用了StringRedisTemplate之后,需要我們手動進行對象的序列化和反序列化,其他的操作和使用RedisTemplate并無差別,但是這樣之后,存儲一個Java對象就不會再存儲其字節碼等額外信息了:

在這里插入圖片描述

這樣做會增加額外的代碼處理,但是可以極大的節約內存資源,是推薦的做法。

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

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

相關文章

B. Shrinking Array/縮小數組

B. Shrinking Array讓我們稱一個數組 b 為 i 美麗 &#xff0c;如果它至少包含兩個元素&#xff0c;并且存在一個位置 |bi?bi1|≤1 使得 |x| (其中 x 是 #10# #11# 的絕對值)。給定一個數組 a &#xff0c;只要它至少包含兩個元素&#xff0c;你就可以執行以下操作&#xff1a…

【學習筆記】Linux系統中SSH服務安全配置

一、背景知識 以ubuntu為例&#xff0c;查看ssh服務是否安全并配置&#xff0c;執行 ssh -V ssh的配置文件路徑&#xff1a;/etc/ssh/sshd_config 二、SSH服務配置文件 1.端口和監聽設置 Port 22 含義&#xff1a;指定SSH服務監聽的端口號&#xff08;默認是22&#xff09…

FastAPI + Tortoise-ORM + Aerich 實現數據庫遷移管理(MySQL 實踐)

在 FastAPI 項目中&#xff0c;Tortoise-ORM 是一個輕量的異步 ORM 框架&#xff0c;適用于 async/await 場景。結合數據庫遷移工具 Aerich&#xff0c;可以優雅地管理數據庫表結構演進&#xff0c;本文將通過完整流程演示如何在 MySQL 環境下使用。&#x1f4e6; 一、環境準備…

7.7日 實驗03-Spark批處理開發(2)

使用Spark處理數據文件檢查數據檢查$DATA_EXERCISE/activations里的數據&#xff0c;每個XML文件包含了客戶在指定月份活躍的設備數據。拷貝數據到HDFS的/dw目錄樣本數據示例&#xff1a;<activations><activation timestamp"1225499258" type"phone&q…

C語言可變參數感悟

#include <stdio.h> #include <stdarg.h> #if 1 /* *在C語言中&#xff0c;可變參函數是指參數數量不固定的函數&#xff0c;比如printf\scanf *可變參函數的語法&#xff1a; *返回類型 函數名&#xff08;固定函數&#xff0c;.....) { //函數體 } *1、包含頭文件…

LeetCode 1248.統計優美子數組

給你一個整數數組 nums 和一個整數 k。如果某個連續子數組中恰好有 k 個奇數數字&#xff0c;我們就認為這個子數組是「優美子數組」。 請返回這個數組中 「優美子數組」 的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2,1,1], k 3 輸出&#xff1a;2 解釋&#xf…

FastAPI Docker環境管理腳本使用指南

作者: 源滾滾AI編程 創建時間: 2025年07月08日 版本: v1.0.0 文檔狀態: 完成 版權聲明 本文檔由源滾滾AI編程創作,版權所有。未經作者書面許可,不得復制、分發或用于商業用途。 免責聲明 本文檔僅用于技術交流和學習目的。作者不對使用本文檔內容導致的任何問題承擔責任。…

前端常見 HTTP 狀態碼

作為前端開發者&#xff0c;與后端 API 交互時&#xff0c;HTTP 狀態碼是判斷請求成敗的關鍵信號。理解常見狀態碼的含義、責任歸屬及應對策略&#xff0c;能極大提升調試效率和團隊協作。以下是關鍵狀態碼的詳細解析&#xff1a; 首先說一下如何查看狀態碼&#xff1a; 如上圖…

深度解析C語言內存函數(小米面試題)

目錄 一、memcpy1.1 代碼演示1.2 memcpy的模擬實現 二、memmove2.1 代碼演示2.2 模擬實現&#xff08;小米面試題&#xff09; 三、memset3.1 代碼演示3.2 總結 四、memcmp4.1 代碼演示4.2 總結 總結 一、memcpy &#xff08;memory copy 內存復制&#xff09; 之前文章中寫的…

DK124反激式開關電源芯片

18W 高性能交直流轉換芯片 特性 DK124 是一款離線式開關電源芯片&#xff0c;最大輸出功率達到 24W。內部集成了 PWM 控制器、700V 功率管和初級峰值電流檢測電路&#xff0c;并采用了可以省略輔助供電繞組的專利自供電技術&#xff0c;極大簡化了外圍應用電路&#xff0c;減…

商品銷售數據分析實驗

進入虛擬機&#xff0c;啟動HDFS和Yarn1.創建表 hive show databases; use test;銷售訂單表create table t_dml (detail_id bigint,sale_date date, province string,city string,product_id bigint,cnt bigint,amt double )row format delimited fields terminated by ,;商品…

PH熱榜 | 2025-07-08

1. TensorBlock Forge 標語&#xff1a;人工智能模型的API 介紹&#xff1a;Forge是一個快速且安全的工具&#xff0c;讓你可以跨不同供應商連接和運行AI模型 產品網站&#xff1a; 立即訪問 Product Hunt&#xff1a; View on Product Hunt 票數&#xff1a; &#x1f53a…

2025-01)electronjs-v11.2.0升級到新版本electronjs-v37.2.0記錄,node版本記錄,淘寶鏡像配置記錄,升級記錄

背景:由于22年使用electronjs開發的自助機客戶端幾年沒去維護,現在有需求要修改,電腦也換新了,node環境也沒,直接把electron從 之前的 11.2.0 版本 升級到了37.2.0版本,升級最主要的目的是升級谷歌瀏覽器內核,升級后谷歌瀏覽器內核直接從87升級到了138,可以支持谷歌最新…

iQOO手機怎樣相互遠程控制?其他手機可以遠程控制iQOO嗎?

iQOO是Vivo同一品牌下的產品&#xff0c;它們兩款手機都可以使用手機內置的遠程控制功能。具體做法是&#xff0c;打開控制端的iQOO手機的【設置】【快捷與輔助】、【遠程協助】&#xff0c;然后輸入被控端的電話號碼&#xff0c;等被控端的手機接受遠程協助后&#xff0c;就可…

【入門級-C++程序設計:3、程序基本語句-多層循環語句】

1、定義&#xff1a; 在 C 中&#xff0c;多層循環&#xff08;嵌套循環&#xff09;是指在一個循環體內包含另一個或多個循環語句。它常用于處理多維數據結構&#xff08;如二維數組&#xff09;、復雜的迭代邏輯&#xff08;如矩陣運算、圖形打印、組合遍歷等&#xff09;。多…

四、jenkins自動構建和設置郵箱

一、jenkins自動構建什么自動構建、有啥用&#xff1a;觸發方式代碼提交&#xff08;Git push&#xff09;定時任務&#xff08;如每天凌晨構建&#xff09;手動點擊等方式&#xff08;立即執行&#xff09;執行內容從 Git/SVN 拉取最新代碼運行編譯&#xff08;如 Maven/Gradl…

【深度學習新浪潮】深入解析LLM關鍵概念:架構、優化與最新研究進展

1. Transformer架構與注意力機制 概念解析 Transformer是LLM的核心架構,由編碼器和解碼器組成,其核心創新是自注意力機制,通過計算輸入序列中每個位置的關聯權重,動態聚焦關鍵信息。自注意力機制的計算復雜度為O(n),在處理長序列時成為性能瓶頸。 代碼示例:基礎Transfo…

RAGflow圖像解析與向量化分析

RAGflow圖像解析與向量化分析 注:需要提前部署好ragflow,才方便一 一對應代碼,部署教程:rag部署教程,這樣才會方便后續更改 1. 圖像解析流程 RAGflow通過多種解析器處理不同類型的文檔,其中圖像解析是一個重要組成部分。以下是RAGflow處理圖像的主要流程: 1.1 PDF文…

千翼破界,百景賦能 | 2025深圳eVTOL展無人機場景應用專場即將啟幕

在技術革新、應用深化、產業鏈協同升級及低空空域管理改革等多重政策紅利驅動下&#xff0c;我國工業級無人機產業正邁入爆發式增長新階段&#xff0c;持續引領民用無人機市場繁榮。數據顯示&#xff0c;2019 至2024年&#xff0c;我國民用無人機市場規模從435.1億元躍升至1108…

Go語言標識符命名規則詳解:工程化實踐

引言 Go語言的命名規則是其簡潔哲學和工程實用性的集中體現。下面從語法規范、最佳實踐到實際應用進行全面解析&#xff1a; 一、基礎命名規則 1. 變量命名 // 小駝峰式&#xff08;lowerCamelCase&#xff09; var userName string var maxRetryCount 3 var isConnected bool…