Spring Boot 中 對話 Redis

Redis 是一款開源的,使用 C 開發的高性能內存 Key/Value 數據庫,支持 String、Set、Hash、List、Stream 等等數據類型。它被廣泛用于緩存、消息隊列、實時分析、計數器和排行榜等場景。基本上是當代應用中必不可少的軟件!

Spring Boot 對 Redis 提供了開箱即用的組件:spring-boot-starter-data-redis。通過這個 starter,我們只需要幾行簡單的配置就可以快速地在 Spring Boot 中整合、使用 Redis。

Spring Boot 整合 Redis

Maven 依賴

<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>

除了 spring-boot-starter-data-redis 外,還添加了 commons-pool2 依賴,是因為我們需要使用到連接池。

配置屬性

只需要在 application.yaml | properties 中配置如下常用的基本屬性即可:

spring:redis:# 連接地址host: "localhost"# 端口port: 6379# 數據庫database: 0# 用戶名,如果有# username:# 密碼,如果有# password:# 連接超時connect-timeout: 5s# 讀超時timeout: 5s# Lettuce 客戶端的配置lettuce:# 連接池配置pool:# 最小空閑連接min-idle: 0# 最大空閑連接max-idle: 8# 最大活躍連接max-active: 8# 從連接池獲取連接 最大超時時間,小于等于0則表示不會超時max-wait: -1ms

「注意,如果你使用的 不是 spring boot 2.x ,上述配置的命名空間 不應該是 spring.redis 而是 spring.data.redis

使用 Jedis 客戶端

Spring Data Redis 默認使用 Lettuce 作為 Redis 客戶端。
官方還對 Jedis 提供了支持,你可以根據你的喜好進行選擇。
當然推薦在項目中使用 lettuce 客戶端,因為它是基于 Netty 開發,支持非阻塞式 IO,性能會更好。

要替換為 Jedis,首先需要從 spring-boot-starter-data-redis 排除 lettuce ,并且添加 jedis 依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency> 

然后修改配置文件,把 lettuce 配置替換為 jedis 配置即可:

spring:redis:# jedis客戶端的配置jedis:# 連接池配置pool:# 最小空閑連接min-idle: 0# 最大空閑連接max-idle: 8# 最大活躍連接max-active: 8# 從連接池獲取連接 最大超時時間,小于等于0則表示不會超時max-wait: -1ms

使用 StringRedisTemplate

配置就緒后,StringRedisTemplate 已經可用,你可以在任何地方注入、使用:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DemoApplicationTests {static final Logger logger = LoggerFactory.getLogger(DemoApplicationTests.class);// 注入 StringRedisTemplate@AutowiredStringRedisTemplate stringRedisTemplate;@Testpublic void test() {// 設置this.stringRedisTemplate.opsForValue().set("title", "spring 中文網", Duration.ofMinutes(5));// 讀取String val = this.stringRedisTemplate.opsForValue().get("title");logger.info("value={}", val);}
}   

對于 StringRedisTemplate 更完整的方法列表,你可以參閱其 java doc。

自定義 RedisTemplate

如果基本的 StringRedisTemplate 不能滿足你的需求,你也可以自定義 RedisTemplate 實現。

例如,我們想要自定義一個 JsonRedisTemplate,用于把任意 Java 對象序列化為 json 數據存儲到 Redis,并且也能夠把 Redis 中的 json 數據反序列化為任意 Java 對象。

如下:

package com.zcdf.school.components;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;@Component
public class JsonRedisTemplate extends RedisTemplate<String, Object> {public JsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) {// 構造函數注入 RedisConnectionFactory,設置到父類super.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.registerModule(new JavaTimeModule());serializer.setObjectMapper(objectMapper);// String 類型的 key/value 序列化super.setKeySerializer(StringRedisSerializer.UTF_8);super.setValueSerializer(serializer);// Hash 類型的 key/value 序列化super.setHashKeySerializer(StringRedisSerializer.UTF_8);super.setHashValueSerializer(serializer);}
}

首先,繼承 RedisTemplate<K,V>,泛型 K 表示 Redis Key 類型,一般都是 String,泛型 V 表示 Redis Value 類型,既然我們需要的是一個通用的 JSON Template,所以設置為 Object,Value 值可以是任意對象。

在構造函數中注入 RedisConnectionFactory 設置到父類,「這是必須的」

然后創建GenericJackson2JsonRedisSerializer 實例,它是基于 Jackson 的 RedisSerializer 實現,用于任意 Java 對象和 JSON 字符串之間的序列化/反序列化。使用該實例作為普通 Value 和 Hash Value 的序列化/反序列化器。注意,因為序列化的對象可能包含了 java.time 類型的日期字段,如:LocalTimeLocalDate 以及 LocalDateTime,所以需要注冊 JavaTimeModule

創建測試類進行測試。如下:

    @GetMapping("/eee")public int www() {System.out.println("測試方法開始執行:");// MapMap<String, Object> map = new HashMap<>();map.put("name", "wtt");map.put("url", "https://*****.cn");map.put("createAt", LocalDateTime.now());jsonRedisTemplate.opsForValue().set("key1-map", map, Duration.ofMinutes(5));Map<String, Object> map2 = (Map<String, Object>) jsonRedisTemplate.opsForValue().get("key1-map");System.out.println(map2);// Hash// 設置this.jsonRedisTemplate.opsForHash().put("key2-hash", "app", map);// 讀取map = (Map<String, Object>) this.jsonRedisTemplate.opsForHash().get("key2-hash", "app");log.info("map={}", map);return 0;}

我們創建了一個 Map<String, Object> 對象,存儲了 2 個 String 和一個 LocalDateTime 字段。然后使用 JsonRedisTemplate 把它存儲為普通 Value 和 Hash Value。

存儲成功后,再進行讀取,反序列化為原來的 Map<String, Object> 對象。

運行測試,執行日志如下:

測試方法開始執行:
{name=wtt, url=https://*****.cn, createAt=[2024, 5, 21, 15, 22, 40, 807000000]}
2024-05-21 15:22:41.079  INFO 7316 --- [nio-8888-exec-1] com.zcdf.school.controller.Testwtt       : map={name=wtt, url=https://*****.cn, createAt=[2024, 5, 21, 15, 22, 40, 807000000]}

我們發現,序列化為 JSON、反序列化為對象都沒問題。

好文分享,一起努力加油。

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

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

相關文章

oracle正則的使用

1、建表 create table person (first_name varchar2(20),last_name varchar2(20),email varchar2(40),zip varchar2(20)); insert into PERSON (first_name, last_name, email, zip) values (Steven, Chen, stevenhp.com, 123456); insert into PERSON (first_name, last_name…

ASP+ACCESS基于B2C電子商務網站設計

摘 要 運用ASP技術結合了Access數據庫原理&#xff0c;基于B/S模式我們開發了一個網上購物系統。在我們的系統中&#xff0c;顧客可以很方便的注冊成為會員&#xff0c;對商品進行瀏覽檢索&#xff0c;查看商品的詳細資料&#xff0c;然后根據各人的喜好購買心儀的商品。系統…

CCF20220901——如此編碼

CCF20220901——如此編碼 代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,cnt1,a[1000],c[1000]{1};cin>>n>>m;for(int i1;i<n;i){cin>>a[i];cnt*a[i];c[i]cnt;}int b[1000]{0};for(int i1;i<n;i)b[i](…

JPHS-JMIR Public Health and Surveillance

文章目錄 一、期刊簡介二、征稿信息三、期刊表現四、投稿須知五、投稿咨詢 一、期刊簡介 JMIR Public Health and Surveillance是一本多學科期刊&#xff0c;專注于公共衛生創新與技術的交叉領域&#xff0c;包括公共衛生信息學、監測&#xff08;監測系統和快速報告&#xff…

CCF20220601——歸一化處理

CCF20220601——歸一化處理 代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…

Java基礎(三)- 多線程、網絡通信、單元測試、反射、注解、動態代理

多線程基礎 線程&#xff1a;一個程序內部的一條執行流程&#xff0c;只有一條執行流程就是單線程 java.lang.Thread代表線程 主線程退出&#xff0c;子線程存在&#xff0c;進程不會退出 可以使用jconsole查看 創建線程 有多個方法可以創建線程 繼承Thread類 優點&#x…

【學習】實驗室服務器常用的Linux指令。

1. 下載GitHub代碼。 使用代碼&#xff1a; git clone https://github.com/Turoad/CLRNet.git2. 壓縮 / 解壓。 打包壓縮 是日常工作中備份文件的一種方式 在不同操作系統中&#xff0c;常用的打包壓縮方式是不同的選項 含義 Windows 常用 rarMac 常用 zipLinux 常用 tar.gz…

學碩都考11408的211院校!河北工業大學計算機考研考情分析!

河北工業大學&#xff08;Hebei University of Technology&#xff09;&#xff0c;簡稱河北工大&#xff0c;坐落于天津市&#xff0c;由河北省人民政府、天津市人民政府與中華人民共和國教育部共建&#xff0c; 隸屬于河北省&#xff0c;是國家“雙一流”建設高校、國家“211…

自動化測試在軟件開發生命周期中如何提高代碼質量?

自動化測試是一種在軟件開發生命周期中使用軟件工具來執行測試的方法&#xff0c;它可以大大提高代碼質量&#xff0c;減少開發過程中的錯誤和缺陷。本文將從零開始&#xff0c;詳細且規范地介紹如何使用自動化測試來提高代碼質量。 第一步&#xff1a;明確測試目標 在開始自…

webgl入門-繪制三角形

繪制三角形 前言 三角形是一個最簡單、最穩定的面&#xff0c;webgl 中的三維模型都是由三角面組成的。咱們這一篇就說一下三角形的繪制方法。 課堂目標 理解多點繪圖原理。可以繪制三角形&#xff0c;并將其組合成多邊形。 知識點 緩沖區對象點、線、面圖形 第一章 web…

Python高克勒-曼寧-斯特里克勒公式計算一維流量

&#x1f4dc;曼寧公式-用例 &#x1f4dc;Python流體數據統計模型和淺水滲流平流模型模擬 | &#x1f4dc;Python蒸發散物理問題(微積分-線性代數-拉普拉斯和傅立葉變換) ??Python計算一維流量 高克勒-曼寧-斯特里克勒公式公式基于一維&#xff08;橫截面平均&#xff09…

iPhone實況照片從Windows資源管理器復制的JPG+MOV無法正常還原到iPhone

背景&#xff1a; 之前使用的iPhone 15 Pro&#xff0c;使用的Windows資源管理器當中復制導出的實況照片&#xff0c;復制出來的格式例如IMG_0001.JPG, IMG_0001.MOV。之后手機就賣掉了。現在使用的iPhone 14 Pro Max&#xff0c;想要導回之前備份的實況照片。嘗試使用愛思助手…

Java18新特性

Java 18引入了若干新特性&#xff0c;以增強語言的功能性和性能。具體如下&#xff1a; 服務提供者接口&#xff08;Service Provider Interfaces, SPI&#xff09;&#xff1a;允許開發者為Java模塊系統定義服務加載機制&#xff0c;從而能夠更靈活地發現和加載服務實現。簡單…

supOS NEO科技普惠!永久免費!億元補貼

數字化轉型正在全球蓬勃發展&#xff0c;工業操作系統進入大規模推廣期&#xff01; 如果您正在被預算不足、技術團隊不強、數字化投入產出比等問題困擾&#xff0c;supOS NEO是您最好的選擇。 “讓supOS走進萬千工廠、千行百業&#xff01;讓全世界每個工廠都能用得上supOS&am…

MM模塊學習三 (創建采購申請)

采購信息記錄比較特殊既是主數據又是貨源 注&#xff1a;發票校驗是指把供應商提供的發票做到系統里面產生一張應付憑證。 1.決定采購需求 采購需求可以手工創建&#xff08;ME51N&#xff09;&#xff0c;也可以自動產生&#xff08;比如&#xff1a;MRP&#xff0c;以及比如…

Java——內部類

1.什么是內部類 在一個類的里面再定義一個類&#xff0c;新定義的這個類就是內部類 舉例&#xff1a;在Outer類的里面定義一個Inter類 class Outer{class Inter{} } 在這里Outer叫外部類&#xff0c;Inter叫內部類 內部類的應用場景 定義一個汽車類&#xff1a; 屬性&#xf…

CTFshow之文件上傳web入門151關-161關解密。包教包會!!!!

這段時間一直在搞文件上傳相關的知識&#xff0c;正好把ctf的題目做做寫寫給自字做個總結&#xff01; 不過有一個確定就是所有的測試全部是黑盒測試&#xff0c;無法從代碼層面和大家解釋&#xff0c;我找個時間把upload-labs靶場做一做給大家講講白盒的代碼審計 一、實驗準…

2024-5-23 石群電路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天氣&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天沒有什么重要的事情發生&#xff0c;心情一如既往的平靜&#xff0c;距離返校假期還有兩天~~~。 今天觀看了石群老師電路基礎課程的第23/24個視頻&#xff0…

Flutter 中的 AnimatedThere 小部件:全面指南

Flutter 中的 AnimatedThere 小部件&#xff1a;全面指南 在Flutter中&#xff0c;動畫是增強用戶體驗的強大工具。雖然Flutter沒有一個名為AnimatedThere的官方小部件&#xff0c;但我們可以根據常見的動畫模式來構建一個類似的自定義動畫效果。本文將指導您如何使用Flutter的…

Python 安裝 ONNX Runtime (ORT)

1. Python 安裝 ONNX Runtime 安裝cpu版的 onnx runtime&#xff1a; pip install onnxruntime 安裝gpu版的 onnx runtime&#xff08;cuda 11.x&#xff09;&#xff1a;(默認安裝適用于cuda 11.8 的onnx runtime) pip install onnxruntime-gpu 安裝gpu版的 onnx runtime…