Spring Boot(二十一):RedisTemplate的String和Hash類型操作

RedisTemplate和StringRedisTemplate的系列文章詳見:

Spring Boot(十七):集成和使用Redis

Spring Boot(十八):RedisTemplate和StringRedisTemplate

Spring Boot(十九):StringRedisTemplate的常用方法和注意事項

Spring Boot(二十):RedisTemplate的序列化

RedisTemplate支持Redis提供的所有數據類型(包括String、Hash、List、Set和ZSet等),并提供靈活的配置選項和事務支持,方便開發者與Redis交互。

String類型操作

如果鍵和值都是String類型,推薦使用StringRedisTemplate來操作,StringRedisTemplate的各種方法,詳見Spring Boot(十九),下面我們來簡單介紹兩個Spring Boot(十九)中沒有涉及的方法

?1、opsForValue().increment?

方法簽名:

Long increment(K key):默認加1,返回遞增后的新值,可直接用于業務判斷

Long increment(K key, long num):如果num為正數,則值加num,如果num為負數,則值減num,返回遞增后的新值,可直接用于業務判斷

示例:

try {stringRedisTemplate.opsForValue().set("name:number", "12345");log.info("name:number, {}", stringRedisTemplate.opsForValue().get("name:number"));Long num = stringRedisTemplate.opsForValue().increment("name:number");log.info("name:number increment加1, {}", num);num = stringRedisTemplate.opsForValue().increment("name:number", 10);log.info("name:number increment加10, {}", num);num = stringRedisTemplate.opsForValue().increment("name:number", -10);log.info("name:number increment減10, {}", num);
} catch (Exception e) {log.info("name:number increment error, {}", e.toString());
} 

2、opsForValue().decrement

方法簽名:

Long decrement(K key):默認減1,返回遞減后的新值,可直接用于業務判斷

Long decrement(K key, long num):如果num為正數,則值減num,如果num為負數,則值加num,返回遞減后的新值,可直接用于業務判斷

3、使用場景

increment的使用場景:

1)獨立計數器:用于統計訪問量、點贊數、下載量等

2)限流:限制接口的訪問頻率,如每秒最多允許訪問100次

3)唯一ID生成:生成全局唯一的遞增ID

4)分布式計數器:跟蹤分布式系統中待處理任務的數量

decrement的使用場景:

1)庫存管理:用于減少商品庫存

2)名額限制:優惠券剩余數量、報名人數統計

3)余額減少:在金融系統中減少賬戶余額

4)限流:減少允許的訪問次數

5)分布式計數器:跟蹤分布式系統中待處理任務的數量

4、注意

1)值的類型必須為整數

使用increment或decrement方法時,如值為整數類型(如String類型的"123"),則會正常的增減,若值為字符串(比如"value"),則會報如下錯誤:

org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range

2)序列化問題

如果使用的是RedisTemplate,需要確保值的序列化器為StringRedisSerializer,在Spring Boot(二十)中我們把RedisTemplate的值的序列化方式改?為了Jackson2JsonRedisSerializer,?所以如果直接使用redisTemplate.opsForValue().increment會報錯,因為這時值為Json格式,值不能直接自增或自減,報錯如下:

org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR value is not an integer or out of range 

3)初始值

執行increment和decrement時,如果鍵不存在,Redis會將其值初始化為0,然后執行自增/自減操作

4)原子性

increment和decrement操作是原子性的,保證在高并發場景下的數據一致性

Hash類型操作

RedisTemplate對Redis中的Hash類型提供了多種操作方法,?通過opsForHash(),?可以進行Hash的增刪查操作。

1、基本操作

Hash類型適合存儲多字段對象或需要頻繁更新部分字段的數據,下面我們通過用戶信息存儲來說明一下Hash類型的操作:

// 存儲用戶信息
redisTemplate.opsForHash().put("user:1001", "name", "Alice");
redisTemplate.opsForHash().put("user:1001", "age", "29");
redisTemplate.opsForHash().put("user:1001", "email", "alice@test.com");// 獲取單個字段
String name = redisTemplate.opsForHash().get("user:1001", "name").toString();
log.info("user:1001 name, {}", name);// 獲取所有字段
Map<String, Object> user = redisTemplate.opsForHash().entries("user:1001");
user.forEach((key, value) -> {log.info("key:{}, value:{}", key, value.toString());
});

還可以使用另外一種方式存儲用戶信息:

Map<String, String> userMap = new HashMap<>();
userMap.put("name", "Rabbit");
userMap.put("age", "3");
userMap.put("email", "rabbit@test.com");
redisTemplate.opsForHash().putAll("user:1002", userMap);

使用Hash類型,更新某屬性的值時非常方便:

// 更新年齡
redisTemplate.opsForHash().put("user:1001", "age", "30");
int age = Integer.parseInt(redisTemplate.opsForHash().get("user:1001", "age").toString());
log.info("user:1001 age, {}", age);

刪除某個屬性:

// 刪除用戶的某個屬性
redisTemplate.opsForHash().delete("user:1001", "email");

2、適用場景

Hash類型適合存儲多字段對象或需要頻繁更新部分字段的數據,包括但不限于以下場景:

1)用戶信息存儲

存儲用戶詳細信息,如姓名、年齡、郵箱等

2)購物車管理

電商系統中,用Hash存儲用戶購物車中的商品及其數量

3)配置管理

集中管理應用配置參數,

4)統計字段聚合

用戶行為的多維度統計,如點贊數、收藏數等

5)對象緩存

緩存數據庫查詢結果(如商品詳情、訂單信息等),減少數據庫壓力

6)分布式Session存儲

在集群環境中,用Hash存儲用戶會話信息(如登錄狀態、權限)

3、注意

1)避免將Hash用于字段數量巨大(如百萬級)的場景,可能引發性能問題

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

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

相關文章

智能指針之設計模式1

本文探討一下智能指針和GOF設計模式的關系&#xff0c;如果按照設計模式的背后思想來分析&#xff0c;可以發現圍繞智能指針的設計和實現有設計模式的一些思想體現。當然&#xff0c;它們也不是嚴格意義上面向對象的設計模式&#xff0c;畢竟它們沒有那么分明的類層次體系&…

中間件--ClickHouse-1--基礎介紹(列式存儲,MPP架構,分布式計算,SQL支持,向量化執行,億萬級數據秒級查詢)

1、概述 ClickHouse是一個用于聯機分析(OLAP)的列式數據庫管理系統(DBMS)。它由俄羅斯的互聯網巨頭Yandex為解決其內部數據分析需求而開發&#xff0c;并于2016年開源。專為大規模數據分析&#xff0c;實時數據分析和復雜查詢設計&#xff0c;具有高性能、實時數據和可擴展性等…

Go之Slice和數組:深入理解底層設計與最佳實踐

在Go語言中&#xff0c;數組&#xff08;Array&#xff09;和切片&#xff08;Slice&#xff09;是兩種看似相似卻本質不同的數據結構。本文將深入剖析它們的底層實現機制&#xff0c;并結合實際代碼示例&#xff0c;幫助開發者掌握核心差異和使用場景。 一、基礎概念&#xff…

力扣熱題100——普通數組(不普通)

普通數組但一點不普通&#xff01; 最大子數組和合并區間輪轉數組除自身以外數組的乘積缺失的第一個正數 最大子數組和 這道題是非常經典的適用動態規劃解決題目&#xff0c;但同時這里給出兩種解法 動態規劃、分治法 那么動態規劃方法大家可以在我的另外一篇博客總結中看到&am…

矩陣基礎+矩陣轉置+矩陣乘法+行列式與逆矩陣

GPU渲染過程 矩陣 什么是矩陣&#xff08;Matrix&#xff09; 向量 &#xff08;3&#xff0c;9&#xff0c;88&#xff09; 點乘&#xff1a;計算向量夾角 叉乘&#xff1a;計算兩個向量構成平面的法向量。 矩陣 矩陣有3行&#xff0c;2列&#xff0c;所以表示為M32 獲取固…

MySQL之text字段詳細分類說明

在 MySQL 中&#xff0c;TEXT 是用來存儲大量文本數據的數據類型。TEXT 類型可以存儲非常長的字符串&#xff0c;比 VARCHAR 類型更適合存儲大塊的文本數據。TEXT 數據類型分為以下幾個子類型&#xff0c;每個子類型用于存儲不同大小范圍的文本數據&#xff1a; TINYTEXT: 可以…

超詳細!Android 面試題大匯總與深度解析

一、Java 與 Kotlin 基礎 1. Java 的多態是如何實現的&#xff1f; 多態是指在 Java 中&#xff0c;同一個行為具有多個不同表現形式或形態的能力。它主要通過方法重載&#xff08;Overloading&#xff09;和方法重寫&#xff08;Overriding&#xff09;來實現。 方法重載&a…

如何提高webrtc操作跟手時間,降低延遲

第一次做webrtc項目&#xff0c;操作延遲&#xff0c;一直是個問題&#xff0c;多次調試都不能達到理想效果。偶爾發現提高jitterBuffer時間可以解決此問題。關鍵代碼 const _setJitter (values: number) > { const receives peerConnection.getReceivers();receives.f…

語音合成(TTS)從零搭建一個完整的TTS系統-第一節-效果演示

一、概述 語音合成又叫文字轉語音&#xff08;TTS-text to speech &#xff09;&#xff0c;本專題我們記錄從零搭建一個完整的語音合成系統&#xff0c;包括文本前端、聲學模型和聲碼器&#xff0c;從模型訓練到系統的工程化實現&#xff0c;模型可以部署在手機等嵌入式設備上…

實驗三 I/O地址譯碼

一、實驗目的 掌握I/O地址譯碼電路的工作原理。 二、實驗電路 實驗電路如圖1所示&#xff0c;其中74LS74為D觸發器&#xff0c;可直接使用實驗臺上數字電路實驗區的D觸發器&#xff0c;74LS138為地址譯碼器&#xff0c; Y0&#xff1a;280H&#xff5e;287H&…

Linux 使用Nginx搭建簡易網站模塊

網站需求&#xff1a; 一、基于域名[www.openlab.com](http://www.openlab.com)可以訪問網站內容為 welcome to openlab ? 二、給該公司創建三個子界面分別顯示學生信息&#xff0c;教學資料和繳費網站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/stud…

MyBatis 如何使用

1. 環境準備 添加依賴&#xff08;Maven&#xff09; 在 pom.xml 中添加 MyBatis 和數據庫驅動依賴&#xff1a; <dependencies><!-- MyBatis 核心庫 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId&g…

ArkTS組件的三個通用(通用事件、通用屬性、通用手勢)

文章目錄 通用事件點擊事件 onClick觸摸事件 onTouch掛載、卸載事件拖拽事件按鍵事件 onKeyEvent焦點事件鼠標事件懸浮事件組件區域變化事件 onAreaChange組件尺寸變化事件組件可見區域變化事件組件快捷鍵事件自定義事件分發自定義事件攔截 通用屬性尺寸設置位置設置布局約束邊…

智慧城市像一張無形大網,如何緊密連接你我他?

智慧城市作為復雜巨系統&#xff0c;其核心在于通過技術創新構建無縫連接的網絡&#xff0c;使物理空間與數字空間深度融合。這張"無形大網"由物聯網感知層、城市數據中臺、人工智能中樞、數字服務入口和安全信任機制五大支柱編織而成&#xff0c;正在重塑城市運行規…

【python】django sqlite版本過低怎么辦

方法一&#xff1a;下載最新版本 復制上面的內容的鏈接 在服務器上進行操作 wget https://sqlite.org/2025/sqlite-autoconf-3490100.tar.gz tar -zxvf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefix/usr/local make && make in…

PyTorch - Tensor 學習筆記

上層鏈接&#xff1a;PyTorch 學習筆記-CSDN博客 Tensor 初始化Tensor import torch import numpy as np# 1、直接從數據創建張量。數據類型是自動推斷的 data [[1, 2],[3, 4]] x_data torch.tensor(data)torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])輸出&am…

【技術派后端篇】ElasticSearch 實戰指南:環境搭建、API 操作與集成實踐

1 ES介紹及基本概念 ElasticSearch是一個基于Lucene 的分布式、高擴展、高實時的基于RESTful 風格API的搜索與數據分析引擎。 RESTful 風格API的特點&#xff1a; 接受HTTP協議的請求&#xff0c;返回HTTP響應&#xff1b;請求的參數是JSON&#xff0c;返回響應的內容也是JSON…

從標準九九表打印解讀單行表達式的書寫修煉(Python)

解讀單行表達式書寫&#xff0c;了解修習單行捷徑。 筆記模板由python腳本于2025-04-16 23:24:17創建&#xff0c;本篇筆記適合喜歡單行喜好python的coder翻閱。 【學習的細節是歡悅的歷程】 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅是知識的簡單復述…

深入解析布爾注入:原理、實戰與防御

目錄 一、布爾注入的原理與核心邏輯 二、布爾注入的實戰步驟 三、關鍵函數與繞過技巧 四、實戰案例&#xff1a;獲取數據庫名稱 五、防御策略與最佳實踐 六、總結 一、布爾注入的原理與核心邏輯 布爾注入&#xff08;Boolean-Based Blind SQL Injection&#xff09;是一種…

OpenGL學習筆記(幾何著色器、實例化、抗鋸齒)

目錄 幾何著色器爆破物體法向量可視化 實例化&#xff08;偏移量存在uniform中&#xff09;實例化數組&#xff08;偏移量存在頂點屬性中&#xff09;小行星帶 抗鋸齒SSAA&#xff08;Super Sample Anti-aliasing&#xff09;MSAA&#xff08;Multi-Sampling Anti-aliasing&…