項目中引入 Redis 及 常用五種數據類型

????????在平常的開發過程中,我們經常會用到緩存的技術。比如,驗證碼60秒后過期、計數器的實現、商品信息存儲在緩存中快速展示等。那么,項目中經常會使用到的便是 redis 緩存。redis 在內存中操作,讀寫快。Redis 常用的數據類型有五種,String、List、Hash、Set、Sorted Set。那么,今天我們總結下項目中引入 Redis 及常見數據類型操作。

? ? ?一:概述

????????Redis 基于內存的數據結構存儲系統,主要用于緩存、分布式鎖等場景。數據結構豐富:Redis 支持多種數據結構,常用的如字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)等。可以支持不同業務場景的使用。
????????Redis 將數據存儲在內存中,讀寫快。內存的高速訪問特性使得 Redis 可以在短時間內處理大量的請求,適用于對性能要求極高的場景,如實時數據處理、緩存等。Redis 也提供了持久化機制,如 RDB(Redis Database)快照和 AOF(Append Only File)日志,能夠將內存中的數據定期或實時地保存到磁盤上,以防止數據丟失。
????????Redis 的命令具有原子性,即一個命令要么完全執行,要么完全不執行,不會出現部分執行的情況。這保證了數據的一致性和完整性。

? ? ? 二:引入依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.1.5.RELEASE</version> <!-- 版本與 Spring Boot 保持一致 -->
</dependency>

? ? ? ? 注意:引入 Redis 的版本與 Springboot 版本保持一致。

? ? ?三:redis 連接信息配置

? ? ? ? 1:如果 Spring boot 2.x 版本,那么在 application.yml 中配置 redis 連接信息如下:

spring:redis:# 連接地址host: 127.0.0.1# 端口port: 6379# 數據庫database: 0# 用戶名# username: username# 密碼password: passrord# 連接超時# connect-timeout: 5s# 讀超時# timeout: 30

? ? ? ? 2:如果 Spring boot 3.x 版本,那么在 application.yml 中配置 redis 連接信息如下:

spring:data:redis:# 連接地址host: 127.0.0.1# 端口port: 6379# 數據庫database: 0# 用戶名# username: username# 密碼password: passrord# 連接超時# connect-timeout: 5s# 讀超時# timeout: 30

????????注意:Spring Boot 3.x 對配置屬性進行了更嚴格的規范化,將數據相關的配置統一到 spring.data 命名空間下,提高一致性和可維護性。

? ? ?四:五種常用數據類型

? ? ?1:字符串 String

? ? ? ? 應用場景:驗證碼、計數器、分布式鎖,最大可存儲 512 m。

? ? ? ? 代碼示例:

// 操作字符串
// 不設置過期時間
stringRedisTemplate.opsForValue().set("11", "蜜薯");
// 設置過期時間為 10 秒鐘
stringRedisTemplate.opsForValue().set("12", "馬鈴薯", Duration.ofSeconds(10));
// 設置過期時間為 10 秒鐘
stringRedisTemplate.opsForValue().set("13", "紅薯", 10,  TimeUnit.SECONDS);
// 獲取值
String value11 = stringRedisTemplate.opsForValue().get("11");
log.info("value11={}", JSONUtil.toJsonStr(value11));	

??????2:列表 List

????????應用場景:有序元素集合 用戶搜索近十條歷史記錄、最新消息展示

????????代碼示例:

// 有序元素集合 用戶搜索近十條歷史記錄、最新消息展示
// 操作 list
List<SysDictData> dictDataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {SysDictData dictData = new SysDictData();dictData.setDictCode(Long.valueOf(i));dictData.setDictLabel("字典" + i);dictDataList.add(dictData);
}
// 將 list 對象轉為 String
// 不設置過期時間
stringRedisTemplate.opsForValue().set("dictListString", JSONUtil.toJsonStr(dictDataList));
// 設置過期時間
stringRedisTemplate.opsForValue().set("dictListString", JSONUtil.toJsonStr(dictDataList), 10, TimeUnit.MINUTES);
String dictListString = stringRedisTemplate.opsForValue().get("dictListString");
List<SysDictData> dictDataListRedis = JSONUtil.toList(dictListString, SysDictData.class);
log.info("dictDataListRedis={}", JSONUtil.toJsonStr(dictDataListRedis));stringRedisTemplate.opsForList().leftPush("dictList", "字典1");
stringRedisTemplate.opsForList().leftPush("dictList", "字典2");
stringRedisTemplate.opsForList().leftPush("dictList", "字典3");
stringRedisTemplate.opsForList().leftPush("dictList", "字典4");stringRedisTemplate.opsForList().rightPush("dictList", "字典5");
// 取出 list 中所有的值
List<String> dictListValueAll = stringRedisTemplate.opsForList().range("dictList", 0, -1);
log.info("dictListValueAll={}", JSONUtil.toJsonStr(dictListValueAll));
// 取出 list 中前三條數據
List<String> dictListValueThree = stringRedisTemplate.opsForList().range("dictList", 0, 2);
log.info("dictListValueThree={}", JSONUtil.toJsonStr(dictListValueThree));

? ? ? 3:哈希 Hash

? ? ? ? 應用場景:field-value 映射表,適合存儲對象,用戶屬性信息、商品信息

? ? ? ? 代碼示例:

// 添加 111 用戶
stringRedisTemplate.opsForHash().put("111", "name", "張三");
stringRedisTemplate.opsForHash().put("111", "age", "98");
stringRedisTemplate.opsForHash().put("111", "phone", "123456789");
stringRedisTemplate.opsForHash().put("111", "address", "西安");
// 添加 222 用戶
stringRedisTemplate.opsForHash().put("222", "name", "李四");
stringRedisTemplate.opsForHash().put("222", "age", "88");
stringRedisTemplate.opsForHash().put("222", "phone", "123456789");
stringRedisTemplate.opsForHash().put("222", "address", "寶雞");
// 獲取全部元素
Map<Object, Object> scoresMap = stringRedisTemplate.opsForHash().entries("scores");
log.info("scoresMap={}", JSONUtil.toJsonStr(scoresMap));
// 獲取某個 key 的值
Object scoresSingleMap = stringRedisTemplate.opsForHash().get("scores", "112");
log.info("scoresSingleMap={}", JSONUtil.toJsonStr(scoresSingleMap));

? ? ? 4:集合 Set

? ? ? ? 應用場景:無序、元素不可重復 抽獎系統、計數器

? ? ? ? 代碼示例:

stringRedisTemplate.opsForSet().add("cities", "11", "12", "13", "14", "15", "16");
// 獲取到所有值 適合數據量小
Set<String> setCitiesAll = stringRedisTemplate.opsForSet().members("cities");
log.info("setCitiesAll={}", JSONUtil.toJsonStr(setCitiesAll));

? ? ? 5:有序集合 Sorted Set

? ? ? ? 應用場景:帶分數的 set,分數可以重復,元素唯一 ? 排行榜、范圍查詢

? ? ? ? 代碼示例:

stringRedisTemplate.opsForZSet().add("studentIds", "111", 1);
stringRedisTemplate.opsForZSet().add("studentIds", "112", 2);
stringRedisTemplate.opsForZSet().add("studentIds", "113", 3);
stringRedisTemplate.opsForZSet().add("studentIds", "114", 4);
stringRedisTemplate.opsForZSet().add("studentIds", "115", 5);
stringRedisTemplate.opsForZSet().add("studentIds", "116", 6);
// 數據量小,全部獲取        
Set set = stringRedisTemplate.opsForZSet().range("studentIds", 0, -1);
log.info("studentIds set={}", JSONUtil.toJsonStr(set));

? ? ? ? 如果數據量大,則分頁獲取:

// 獲取數據總條數
Long totalSize = stringRedisTemplate.opsForZSet().size("studentIds");
// 分頁獲取key中的數據
Set<String> studentIdsSet = new HashSet<>();
// 每頁獲取的記錄數
int pageSize = 2;
// 計算總頁數   
int totalPages = (int) Math.ceil(totalSize / (double) pageSize);
for (int page = 0; page < totalPages; page++) {// 每次獲取數據開始的位置long start = (long) page * pageSize;// 每次獲取數據結束的位置long end = start + pageSize - 1;// 獲取數據Set<ZSetOperations.TypedTuple<String>> setData = stringRedisTemplate.opsForZSet().rangeWithScores("studentIds", start, end);if (CollUtil.isNotEmpty(setData)) {// 將數據進行轉換Set<String> cacheData = setData.stream().map(item -> {String value = JSONObject.parseObject(item.getValue(), String.class);return value;}).filter(Objects::nonNull).collect(Collectors.toSet());studentIdsSet.addAll(cacheData);}
}

? ? ?五:總結

? ? ? ?以上為項目中引入 Redis 的基本步驟,以及常見五種數據類型的應用場景及操作方法。
???????Redis 廣泛應用于緩存、消息隊列、實時分析、分布式鎖等場景。它支持多種數據結構(如 String、List、Hash、Set、Sorted Set等),并提供了持久化、高可用、集群、事務、Lua 腳本、發布/訂閱等。
???????Redis 數據存儲在內存中,讀寫速度快,適用于高并發低延遲場景。同時,它支持 RDB(快照)和 AOF(日志追加)持久化,確保數據安全。

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

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

相關文章

Spark-SQL簡介及核心編程

Spark-SQL概述&#xff1a;是Spark用于結構化數據處理的模塊&#xff0c;前身是Shark。Shark基于Hive開發&#xff0c;使SQL-on-Hadoop性能大幅提升&#xff0c;但對Hive依賴制約了Spark發展。SparkSQL汲取Shark優點并重新開發&#xff0c;在數據兼容、性能優化和組件擴展上優勢…

奇趣點播系統測試報告

1.項目簡介 本項目旨在搭建一個視頻共享點播系統&#xff0c;服務器支持用戶通過前端瀏覽器訪問服務器&#xff0c;獲取展示與觀看和操作的界面&#xff0c;最終實現視頻的上傳以及觀看和刪改查等基礎管理功能。讓用戶擁有良好的觀看體驗和分享視頻的快捷方式&#xff0c;此外…

【Web API系列】WebSocketStream API 深度實踐:構建高吞吐量實時應用的流式通信方案

前言 在當今的 Web 開發領域&#xff0c;實時通信已成為許多應用的核心需求。無論是即時聊天、實時數據儀表盤&#xff0c;還是在線游戲和金融交易系統&#xff0c;都需要高效的雙向數據傳輸能力。傳統的 WebSocket API 為此提供了基礎支持&#xff0c;但在處理大規模數據流、…

基于LangGraph的智能報告生成平臺項目分析

前言 不知道你是否知道或者了解OpenAI and Gemini Deep Research。他們是一種能夠根據輸入問題進行規劃、結合網絡搜索獲取信息并最終呈現結果的研究工具或技術。那這樣research是如何實現的呢?最近剛好看到一個實現類似功能的開源項目: open_deep_search。本文將基于該項目進…

Redis 常見的集群架構

Redis 常見的集群架構 以下是 Redis 常見的集群架構及其核心模式詳解&#xff0c;結合其設計原理、適用場景和優缺點進行綜合說明&#xff1a; 一、主從復制模式 架構原理 角色劃分&#xff1a;包含一個主節點&#xff08;Master&#xff09;和多個從節點&#xff08;Slave&…

面試寶典(C++基礎)-01

文章目錄 1. C++基礎1.1 C++特點1.2 說說C語言和C++的區別1.3 說說 C++中 struct 和 class 的區別1.4 include頭文件的順序以及雙引號""和尖括號<>的區別1.5 說說C++結構體和C結構體的區別1.6 導入C函數的關鍵字是什么,C++編譯時和C有什么不同?1.7 C++從代碼…

快速獲得ecovadis認證的方法,如何提升ecovadis認證分數,有效期是多久

快速獲得EcoVadis認證的方法 EcoVadis認證是企業社會責任&#xff08;CSR&#xff09;和可持續發展能力的國際評估標準&#xff0c;被廣泛應用于供應鏈管理&#xff08;如蘋果、微軟、聯合利華等巨頭要求供應商通過EcoVadis評估&#xff09;。以下是快速獲得認證的關鍵步驟&am…

ubuntu 安裝samba

ubuntu 版本&#xff1a;Ubuntu 24.04.2 LTS 1. 保證連網 2. 安裝samba sudo apt install samba 在安裝結束以后&#xff0c;我們可以使用下面的命令來查看安裝&#xff1a; apt list | grep samba freeipa-client-samba/noble 4.11.1-2 amd64 ldb-tools/noble 2:2.8.0samba…

基于SpringBoot的寵物健康咨詢系統(源碼+數據庫+萬字文檔)

502基于SpringBoot的寵物健康咨詢系統&#xff0c;系統包含三種角色&#xff1a;管理員、用戶&#xff0c;顧問主要功能如下。 【用戶功能】 1. 首頁&#xff1a;查看系統主要信息和最新動態。 2. 公告&#xff1a;瀏覽系統發布的公告信息。 3. 顧問&#xff1a;瀏覽可提供咨詢…

人工智能驅動的科研新范式及學科應用研究

人工智能&#xff08;AI&#xff09;驅動的科研新范式通過數據、算力、算法的深度耦合深度嵌入科學研究的全過程&#xff0c;引發科研流程、思考邏輯和組織模式的深刻變革。文章系統總結了AI驅動科研新范式的主要特征與形式&#xff0c;提出AI驅動科研新范式的演化方向由“科研…

代碼生成工具explain的高級用法

修改 explain.cpp 中的模板部分&#xff1a; // 添加自定義頭文件 cout << "#include \"CustomLib.h\"\n"; 生成支持日志的記錄代碼&#xff1a; cout << "Logger::init();\n"; // 自動插入初始化代碼其他匯總 Magnet 多線程控制…

Vue3+elementPlus中 樹形控件封裝

1.組件 <template><div class"selection"><el-select placeholder"請選擇" v-model"nameList" clearable clear"handleClear" ref"selectUpResId" style"width: 100%"><el-option hidden :…

輝視監獄廣播對講系統:SIP協議賦能智慧監管新生態

一、全域互聯&#xff1a;構建監獄安防設備協同生態 基于SIP協議的輝視廣播對講系統&#xff0c;以"通信中樞"角色打破設備壁壘。其強大的兼容性可無縫對接監獄現有監控、門禁、報警等異構設備&#xff0c;支持GB/T 28181國標協議&#xff0c;實現跨品牌、跨系統的數…

信息系統項目管理師-工具名詞解釋(上)

本文章記錄學習過程中,重要的知識點,是否為重點的依據,來源于官方教材和歷年考題,持續更新共勉 本文章記錄學習過程中,重要的知識點,是否為重點的依據,來源于官方教材和歷年考題,持續更新共勉 數據收集 頭腦風暴 在短時間內獲得大量創意,適用于團隊環境,需要引導者…

C++之二叉搜索樹

目錄 ?叉搜索樹的概念 二叉搜索數的性能分析 二叉搜索樹的模擬實現 定義二叉樹節點結構 二叉搜索樹的插入 二叉搜索樹的查找 二叉搜索樹的刪除 中序遍歷 全部代碼 二叉搜索樹key和key/value使用場景 key搜索場景&#xff1a; key/value搜索場景&#xff1a; key/value…

數據結構——哈希詳解

數據結構——哈希詳解 目錄 一、哈希的定義 二、六種哈希函數的構造方法 2.1 除留取余法 2.2 平方取中法 2.3 隨機數法 2.4 折疊法 2.5 數字分析法 2.6 直接定值法 三、四種解決哈希沖突的方法 3.1 開放地址法 3.1.1 線性探測法 3.1.2 二次探測法 3.2 鏈地址法 3…

使用U盤安裝 ubuntu 系統

1. 準備U 盤制作鏡像 1.1 下載 ubuntu iso https://ubuntu.com/download/ 這里有多個版本以供下載&#xff0c;本文選擇桌面版。 1.2 下載rufus https://rufus.ie/downloads/ 1.3 以管理員身份運行 rufus 設備選擇你用來制作啟動項的U盤&#xff0c;不能選錯了&#xff1b;點…

RadioMaster POCKET遙控器進入ExpressLRS界面一直顯示Loading的問題解決方法

RadioMaster POCKET遙控器進入ExpressLRS界面一直顯示Loading的問題解決方法 問題描述解決方法 問題描述 有一天我發現我的 RadioMaster POCKET 遙控器進入 ExpressLRS 設置界面時&#xff0c;界面卻一直停留在 “Loading” 狀態&#xff0c;完全無法進入設置界面。 我并沒有…

計算機網絡 - 三次握手相關問題

通過一些問題來討論 TCP 協議中的三次握手機制 說一下三次握手的大致過程&#xff1f;為什么需要三次握手&#xff1f;2 次不可以嗎&#xff1f;第三次握手&#xff0c;可以攜帶數據嗎&#xff1f;第二次呢&#xff1f;三次握手連接階段&#xff0c;最后一次ACK包丟失&#xf…

【RabbitMQ】核心概念和工作流程

文章目錄 RabbitMQ 工作流程流程圖 Producer 和 ConsumerConnecting 和 ChannelVirtual hostQueueExchangeRabbitMQ 工作流程 RabbitMQ 工作流程 流程圖 RabbitMQ 就是一個生產者/消費者模型 Producer 就是生產者、Consumer 就是消費者Broker 是 RabbitMQ 服務器生產者和消費…