SpringBoot集成Redis 靈活使用 TypedTuple 和 DefaultTypedTuple 實現 Redis ZSet 的復雜操作

以下是 Spring Boot 集成 Redis 中 TypedTupleDefaultTypedTuple 的詳細使用說明,包含代碼示例和場景說明:


1. 什么是 TypedTuple 和 DefaultTypedTuple?

  • TypedTuple<T> 接口
    定義了 Redis 中有序集合(ZSet)的元素結構,包含 元素值(value)分數(score)

    • T 表示元素的類型(如 String、自定義對象等)。
  • DefaultTypedTuple<T>
    TypedTuple 的實現類,用于創建包含元素和分數的元組對象,常用于 ZSet 的增刪改查操作


2. 使用場景

TypedTuple 主要用于以下場景:

  1. 存儲帶分數的元素(如排行榜、優先級隊列)。
  2. 獲取元素時同時獲取分數(如查詢用戶積分及排名)。
  3. 批量操作 ZSet(如添加多個元素并指定分數)。

3. Spring Boot 配置

3.1 添加依賴

pom.xml 中添加以下依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId>
</dependency>
3.2 配置 RedisTemplate
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 設置鍵和值的序列化器template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}

4. TypedTuple 的核心操作

4.1 創建 TypedTuple 對象

通過 DefaultTypedTuple 構造函數創建:

TypedTuple<String> tuple = new DefaultTypedTuple<>("Alice", 90.0); // 元素值為 "Alice",分數為90.0
4.2 添加元素到 ZSet
// 添加單個元素
redisTemplate.opsForZSet().add("leaderboard", "Alice", 90.0);// 或使用 TypedTuple 批量添加
redisTemplate.opsForZSet().add("leaderboard", new DefaultTypedTuple<>("Alice", 90.0),new DefaultTypedTuple<>("Bob", 85.0));
4.3 獲取元素和分數
// 獲取所有元素及其分數(按分數升序)
Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, -1);for (TypedTuple<String> tuple : tuples) {String member = tuple.getValue(); // 元素值(如 "Alice")Double score = tuple.getScore(); // 分數(如 90.0)System.out.println("Member: " + member + ", Score: " + score);
}
4.4 更新元素分數
// 更新元素的分數
redisTemplate.opsForZSet().add("leaderboard", "Alice", 95.0); // 若已存在,分數會被更新
4.5 刪除元素
// 刪除指定元素
redisTemplate.opsForZSet().remove("leaderboard", "Alice");

5. 完整代碼示例

5.1 服務類實現
@Service
public class RankService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 添加用戶到排行榜public void addUserToLeaderboard(String userId, double score) {redisTemplate.opsForZSet().add("leaderboard", userId, score);}// 獲取前10名用戶及其分數public List<ScoredUser> getTop10() {Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, 9);List<ScoredUser> result = new ArrayList<>();for (TypedTuple<String> tuple : tuples) {ScoredUser user = new ScoredUser();user.setId(tuple.getValue());user.setScore(tuple.getScore());result.add(user);}return result;}// 自定義返回對象@Dataprivate static class ScoredUser {private String id;private Double score;}
}
5.2 使用示例
@Autowired
private RankService rankService;// 添加用戶
rankService.addUserToLeaderboard("user1001", 90.0);
rankService.addUserToLeaderboard("user1002", 85.0);// 獲取前10名
List<ScoredUser> top10 = rankService.getTop10();
for (ScoredUser user : top10) {System.out.println("ID: " + user.getId() + ", Score: " + user.getScore());
}

6. 關鍵代碼說明

6.1 添加元素(帶分數)
// 直接添加元素和分數
redisTemplate.opsForZSet().add(key, member, score);// 使用 TypedTuple 批量添加
redisTemplate.opsForZSet().add(key, new DefaultTypedTuple<>("Alice", 90.0),new DefaultTypedTuple<>("Bob", 85.0));
6.2 獲取元素和分數
// 獲取帶分數的元素(按分數降序)
Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, start, end);// 遍歷獲取每個元素和分數
for (TypedTuple<String> tuple : tuples) {String member = tuple.getValue();Double score = tuple.getScore();
}
6.3 更新元素分數
// 若元素已存在,會更新其分數
redisTemplate.opsForZSet().add(key, member, newScore);

7. 總結表格

操作方法描述
添加元素opsForZSet().add(key, member, score)添加元素并指定分數。
批量添加opsForZSet().add(key, tuples)使用 TypedTuple 列表批量添加元素。
獲取元素和分數opsForZSet().reverseRangeWithScores(key, start, end)獲取指定范圍的元素及其分數(按分數降序)。
更新分數opsForZSet().add(key, member, newScore)若元素已存在,更新其分數。
刪除元素opsForZSet().remove(key, member)刪除指定元素。

8. 注意事項

  1. 泛型類型

    • TypedTuple<T> 的類型 T 必須與 ZSet 中的元素類型一致(如 String、自定義對象等)。
    • 若存儲自定義對象,需確保序列化配置正確(如使用 GenericJackson2JsonRedisSerializer)。
  2. 分數范圍查詢

    • 使用 rangeByScoreWithScores(key, min, max) 可根據分數范圍獲取元素。
  3. 性能優化

    • 大量數據操作時,優先使用批量操作(如 add 接受 TypedTuple 列表)。

通過以上示例和說明,可以靈活使用 TypedTupleDefaultTypedTuple 實現 Redis ZSet 的復雜操作。

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

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

相關文章

遞歸實現組合型枚舉(DFS)

從 1~n 這 n 個整數中隨機選出 m 個&#xff0c;輸出所有可能的選擇方案。 輸入格式 兩個整數 n,m,在同一行用空格隔開。 輸出格式 按照從小到大的順序輸出所有方案&#xff0c;每行 1 個。 首先&#xff0c;同一行內的數升序排列&#xff0c;相鄰兩個數用一個空格隔開。…

CentOS 7 鏡像源失效解決方案(2025年)

執行 yum update 報錯&#xff1a; yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加載插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirror…

vue3 腳手架初始化項目生成文件的介紹

文章目錄 一、介紹二、舉例說明1.src/http/index.js2.src/router/index.js3.src/router/routes.js4.src/stores/index.js5.src/App.vue6.src/main.js7.babel.config.js8.jsconfig.json9.vue.config.js10. .env11.src/mock/index.js12.src/mock/mock-i18n.js13.src/locales/en.j…

ubuntu 20.04 編譯和運行A-LOAM

1.搭建文件目錄和clone代碼 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代碼文件 2.1 由于PCL版本1.10&#xff0c;將CMakeLists.txt中的C標準改為14&#xff1a; set(CMAKE_CXX_FLAGS "-stdc14"…

【教程】MacBook 安裝 VSCode 并連接遠程服務器

目錄 需求步驟問題處理 需求 在 Mac 上安裝 VSCode&#xff0c;并連接跳板機和服務器。 步驟 Step1&#xff1a;從VSCode官網&#xff08;https://code.visualstudio.com/download&#xff09;下載安裝包&#xff1a; Step2&#xff1a;下載完成之后&#xff0c;直接雙擊就能…

LabVIEW 長期項目開發

LabVIEW 憑借其圖形化編程的獨特優勢&#xff0c;在工業自動化、測試測量等領域得到了廣泛應用。對于長期運行、持續迭代的 LabVIEW 項目而言&#xff0c;其開發過程涵蓋架構設計、代碼管理、性能優化等多個關鍵環節&#xff0c;每個環節都對項目的成功起著至關重要的作用。下面…

用matlab搭建一個簡單的圖像分類網絡

文章目錄 1、數據集準備2、網絡搭建3、訓練網絡4、測試神經網絡5、進行預測6、完整代碼 1、數據集準備 首先準備一個包含十個數字文件夾的DigitsData&#xff0c;每個數字文件夾里包含1000張對應這個數字的圖片&#xff0c;圖片的尺寸都是 28281 像素的&#xff0c;如下圖所示…

Go 語言語法精講:從 Java 開發者的視角全面掌握

《Go 語言語法精講&#xff1a;從 Java 開發者的視角全面掌握》 一、引言1.1 為什么選擇 Go&#xff1f;1.2 適合 Java 開發者的原因1.3 本文目標 二、Go 語言環境搭建2.1 安裝 Go2.2 推薦 IDE2.3 第一個 Go 程序 三、Go 語言基礎語法3.1 變量與常量3.1.1 聲明變量3.1.2 常量定…

如何選擇優質的安全工具柜:材質、結構與功能的考量

在工業生產和實驗室環境中&#xff0c;安全工具柜是必不可少的設備。它不僅承擔著工具的存儲任務&#xff0c;還直接影響工作環境的安全和效率。那么&#xff0c;如何選擇一個優質的安全工具柜呢&#xff1f;關鍵在于對材質、結構和功能的考量。 01材質&#xff1a;耐用與防腐 …

系統與網絡安全------Windows系統安全(11)

資料整理于網絡資料、書本資料、AI&#xff0c;僅供個人學習參考。 制作U啟動盤 U啟動程序 下載制作U啟程序 Ventoy是一個制作可啟動U盤的開源工具&#xff0c;只需要把ISO等類型的文件拷貝到U盤里面就可以啟動了 同時支持x86LegacyBIOS、x86_64UEFI模式。 支持Windows、L…

【5】搭建k8s集群系列(二進制部署)之安裝master節點組件(kube-controller-manager)

注&#xff1a;承接專欄上一篇文章 一、創建配置文件 cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF KUBE_CONTROLLER_MANAGER_OPTS"--logtostderrfalse \\ --v2 \\ --log-dir/opt/kubernetes/logs \\ --leader-electtrue \\ --kubeconfig/op…

C#里第一個WPF程序

WPF程序對界面進行優化,但是比WINFORMS的程序要復雜很多, 并且界面UI基本上不適合拖放,所以需要比較多的時間來布局界面, 產且需要開發人員編寫更多的代碼。 即使如此,在面對誘人的界面表現, 隨著客戶對界面的需求提高,還是需要采用這樣的方式來實現。 界面的樣式采…

createContext+useContext+useReducer組合管理React復雜狀態

createContext、useContext 和 useReducer 的組合是 React 中管理全局狀態的一種常見模式。這種模式非常適合在不引入第三方狀態管理庫&#xff08;如 Redux&#xff09;的情況下&#xff0c;管理復雜的全局狀態。 以下是一個經典的例子&#xff0c;展示如何使用 createContex…

記一次常規的網絡安全滲透測試

目錄&#xff1a; 前言 互聯網突破 第一層內網 第二層內網 總結 前言 上個月根據領導安排&#xff0c;需要到本市一家電視臺進行網絡安全評估測試。通過對內外網進行滲透測試&#xff0c;網絡和安全設備的使用和部署情況&#xff0c;以及網絡安全規章流程出具安全評估報告。本…

el-table,新增、復制數據后,之前的勾選狀態丟失

需要考慮是否為 更新數據的方式不對 如果新增數據的方式是直接替換原數據數組&#xff0c;而不是通過正確的響應式數據更新方式&#xff08;如使用 Vue 的 this.$set 等方法 &#xff09;&#xff0c;也可能導致勾選狀態丟失。 因為 Vue 依賴數據的響應式變化來準確更新視圖和…

第15屆藍橋杯java-c組省賽真題

目錄 一.拼正方形 1.題目 2.思路 3.代碼 二.勁舞團 1.題目 2.思路 3.代碼 三.數組詩意 1.題目 2.思路 3.代碼 四.封閉圖形個數 1.題目 2.思路 3.代碼 五.吊墜 1.題目 六.商品庫存管理 1.題目 2.思路 3.代碼 七.挖礦 1.題目 2.思路 3.代碼 八.回文字…

玄機-應急響應-入侵排查

靶機排查目標&#xff1a; 1.web目錄存在木馬&#xff0c;請找到木馬的密碼提交 查看/var/www/html。 使用find命令查找 find ./ -type f -name "*.php | xargs grep "eval("查看到1.php里面存在無條件一句話木馬。 2.服務器疑似存在不死馬&#xff0c;請找…

usbip學習記錄

USB/IP: USB device sharing over IP make menuconfig配置&#xff1a; Device Drivers -> Staging drivers -> USB/IP support Device Drivers -> Staging drivers -> USB/IP support -> Host driver 如果還有作為客戶端的需要&#xff0c;繼續做以下配置&a…

愛普生高精度車規晶振助力激光雷達自動駕駛

在自動駕駛技術快速落地的今天&#xff0c;激光雷達作為車輛的“智慧之眼”&#xff0c;其測距精度與可靠性直接決定了自動駕駛系統的安全上限。而在這雙“眼睛”的核心&#xff0c;愛普生&#xff08;EPSON&#xff09;的高精度車規晶振以卓越性能成為激光雷達實現毫米級感知的…

28--當路由器開始“宮斗“:設備控制面安全配置全解

當路由器開始"宮斗"&#xff1a;設備控制面安全配置全解 引言&#xff1a;路由器的"大腦保衛戰" 如果把網絡世界比作一座繁忙的城市&#xff0c;那么路由器就是路口執勤的交通警察。而控制面&#xff08;Control Plane&#xff09;就是警察的大腦&#xf…