Redis常見數據類型及應用場景

好的,我們來詳細講解 Redis 的數據結構及其應用場景。Redis 的強大之處不僅僅在于它支持簡單的鍵值對,更在于它提供了豐富的數據結構,每種結構都針對特定類型的應用場景進行了優化。

核心數據結構與應用場景

Redis 主要支持以下五種核心數據結構:String(字符串)Hash(哈希)List(列表)Set(集合)Sorted Set(有序集合)。此外,還有 Bitmaps、HyperLogLogs、Streams 等更高級的結構。


1. String(字符串)

這是最簡單也是最基礎的數據類型。一個 Key 對應一個 Value。Value 不僅是字符串,也可以是數字(整數或浮點數),并且可以對數字進行自增/自減操作。

  • 內部實現:基于簡單動態字符串(SDS)實現,可以修改的字符串,預分配內存,減少內存頻繁分配。
  • 常用命令SET, GET, MSET, MGET, INCR, DECR, INCRBY

應用場景

  • 緩存:最經典的場景。將數據庫查詢結果、熱點數據、會話信息(Session)等序列化后存入 String,加快訪問速度。
    • SET user:1001 "{name: 'Alice', email: 'alice@example.com'}"
  • 計數器:利用 INCRDECR 命令實現點贊數、瀏覽數、庫存計數等。這些操作是原子性的,非常適合高并發場景。
    • INCR article:1001:views
  • 分布式鎖:利用 SET key value NX EX seconds 命令(當 key 不存在時設置,并設置過期時間)可以實現簡單的分布式鎖。
  • Session 共享:在集群服務中,將用戶的登錄會話信息集中存儲在 Redis 中,實現多臺服務器共享 Session。

2. Hash(哈希)

類似于 Java 中的 Map<String, Object>,是一組鍵值對的集合。非常適合存儲對象。

  • 內部實現:底層有兩種編碼方式:ziplist(壓縮列表,在元素少、體積小時使用)和 hashtable(哈希表)。
  • 常用命令HSET, HGET, HMSET, HMGET, HGETALL, HINCRBY

應用場景

  • 存儲對象:存儲用戶信息、商品信息等需要多個字段的對象。相比將整個對象序列化成 String,Hash 可以單獨獲取、修改某個字段,更節省網絡帶寬和存儲空間。
    • HSET user:1001 name "Alice" age "30" email "alice@example.com"
    • HGET user:1001 name -> “Alice”
  • 購物車:以用戶ID為 Key,商品ID為 Field,商品數量為 Value。
    • HSET cart:1001 product:5001 3 (用戶1001的商品5001數量為3)
    • HINCRBY cart:1001 product:5001 1 (增加1件)

3. List(列表)

一個簡單的字符串列表,按插入順序排序。你可以從列表的頭部(左邊)或尾部(右邊)添加元素。

  • 內部實現:底層是 quicklist(快速列表),它是多個 ziplist 通過雙向指針組成的鏈表,兼顧了空間效率和插入性能。
  • 常用命令LPUSH, RPUSH, LPOP, RPOP, LRANGE, BLPOP (阻塞操作)

應用場景

  • 消息隊列:利用 LPUSH + BRPOP 可以實現一個簡單的 FIFO(先進先出)隊列。生產者從左邊推入消息,消費者用阻塞方式從右邊取出消息。
  • 最新列表:例如最新文章、最新評論、朋友圈時間線。利用 LPUSH 加入新元素,再用 LRANGE 0 9 獲取最新的10條。
    • LPUSH news:latest "News ID 10086"
  • 記錄用戶操作歷史:例如用戶的最近搜索、最近瀏覽記錄。

4. Set(集合)

Redis 的 Set 是 String 類型的無序集合,集合內的元素是唯一的,不允許重復。

  • 內部實現:底層是 intset(整數集合,當元素都是整數且數量少時)或 hashtable(哈希表,value 為 null)。
  • 常用命令SADD, SMEMBERS, SISMEMBER, SINTER (交集), SUNION (并集), SDIFF (差集)

應用場景

  • 標簽(Tag):給用戶、文章等對象打標簽。可以很方便地求交集、并集等。
    • SADD article:1001:tags "tech" "redis" "database"
    • SADD user:1002:tags "tech" "python"
    • SINTER article:1001:tags user:1002:tags -> 獲取共同標簽 “tech”
  • 共同關注/好友:利用 SINTER 可以輕松求出兩個用戶的共同好友。
  • 抽獎/秒殺:利用 SADD 將所有參與用戶ID加入,可以自動保證唯一性,不會重復添加。SMEMBERS 可以列出所有參與者。
  • 黑白名單:將需要過濾的 ID 放入 Set,用 SISMEMBER 快速判斷某個 ID 是否在名單內。

5. Sorted Set(有序集合 / ZSet)

與 Set 類似,也是 String 類型元素的集合,且不允許重復。但每個元素都會關聯一個 double 類型的分數(score)。Redis 正是通過分數來為集合中的成員進行從小到大的排序。成員是唯一的,但分數可以重復。

  • 內部實現:底層是 ziplist(壓縮列表)或 skiplist(跳躍表) + dict(字典)的組合,跳躍表保證范圍查詢的效率,字典保證按成員查詢的效率。
  • 常用命令ZADD, ZRANGE (按分數正序), ZREVRANGE (按分數倒序), ZRANK, ZREVRANK, ZRANGEBYSCORE

應用場景

  • 排行榜:這是最經典的應用場景。將分數設為點擊量、銷量、熱度等,自動進行排序。
    • ZADD leaderboard 100 "player1" 200 "player2"
    • ZREVRANGE leaderboard 0 9 WITHSCORES -> 獲取排行榜前十名
  • 帶權重的隊列:分數可以作為優先級,實現優先級隊列。
  • 范圍查找:例如處理成績表,快速查找分數在 [90, 100] 之間的學生。
    • ZRANGEBYSCORE grades 90 100
  • 延時任務:將任務的執行時間作為 score,用一個進程輪詢獲取到期的任務(ZRANGEBYSCORE key 0 <當前時間戳>)。

其他高級數據結構

  • Bitmaps(位圖): 本質上是 String,但可以對字符串的位進行操作。適用于大量布爾值的存儲,如用戶簽到記錄(每天1bit)、活躍用戶統計,極其節省空間。
  • HyperLogLogs: 用于做基數統計(估算一個集合中不重復元素的個數),標準誤差僅0.81%。優點是非常節省空間。適用于統計網站的 UV(獨立訪客)、搜索關鍵詞的不重復數量等,PFADD, PFCOUNT, PFMERGE
  • Geospatial(地理空間): 可以存儲地理坐標,并計算距離、查找范圍內成員等。適用于附近的人、地理位置推薦。
  • Streams(流): Redis 5.0 引入,專門為消息隊列設計,支持多消費者組、消息持久化、確認機制,功能比 List 更強大,是更專業的消息隊列解決方案。

總結與選擇建議

數據結構特性典型應用場景
String簡單鍵值,支持數字和位操作緩存、計數器、分布式鎖
Hash適合存儲對象,可部分更新用戶信息、購物車、配置項
List有序、可重復,支持阻塞操作消息隊列、最新列表、歷史記錄
Set無序、唯一,支持集合運算標簽、共同好友、抽獎、黑白名單
Sorted Set唯一、有序(按分數排序)排行榜、優先級隊列、范圍查找
Bitmaps極省空間的布爾狀態存儲用戶簽到、活躍用戶統計
HyperLogLog極省空間的基數估算網站UV統計
Streams持久化的消息流復雜消息隊列

選擇時考慮以下幾點

  1. 數據形態:是需要一個對象(Hash)、一個列表(List)、一個不重復集合(Set)還是一個帶排序的集合(ZSet)?
  2. 操作類型:是需要頻繁讀取部分字段(Hash),還是需要排序(ZSet),或是需要集合運算(Set)?
  3. 性能與效率:String 存儲序列化對象雖然簡單,但修改一個字段就需要整個讀寫,不如 Hash 高效。在元素較少時,Redis 會使用更緊湊的編碼(如 ziplist)來節省內存。

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

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

相關文章

【后端數據庫】MySQL 索引生效/失效規則 + 核心原理

SQL 優化的核心 —— 什么時候能“走索引”&#xff0c;什么時候會“失效”。整理一個索引生效/失效規則 核心原理的全景圖&#xff0c;幫助徹底理解。&#x1f511; MySQL 索引使用的核心原理MySQL 使用 BTree 索引&#xff08;最常見&#xff09;&#xff0c;特點是&#xf…

基于 YOLOv11n 的無人機航拍小目標檢測算法學習

基于 YOLOv11n 的無人機航拍小目標檢測算法問題&#xff1a;無人機航拍圖像中小目標檢測面臨尺度變化大導致的檢測精度較低和推理速度較慢等 解決&#xff1a;在 C3k2 模塊中引入可變形卷積&#xff08;DCN&#xff09;&#xff0c;增強模型在復雜背景下對 多尺度目標的特征提取…

第06章:map():數據變形金剛,想變什么變什么

文章目錄map()基礎&#xff1a;一對一的數據轉換map()的工作原理方法引用讓代碼更簡潔對象轉換&#xff1a;實際業務應用用戶信息轉換示例特殊類型的map()&#xff1a;mapToInt、mapToLong、mapToDouble鏈式map()&#xff1a;多重轉換map()與filter()組合&#xff1a;數據處理管…

197-200CSS3響應式布局,BFC

CSS3響應式布局-媒體查詢舉例<title>01.媒體查詢_媒體類型</title><style>h1 {width: 600px;height: 400px;background-image: linear-gradient(60deg,red,yellow,green);font-size: 40px;color: white;text-shadow: 0 0 20px black;text-align: center;line…

[Android] UI進階筆記:從 Toolbar 到可折疊標題欄的完整實戰

學習 Android 開發的過程中&#xff0c;UI 控件往往是最直觀也最容易踩坑的部分。本文整理了我在學習《第一行代碼》后的實踐筆記&#xff0c;涵蓋 Toolbar、自定義標題欄、菜單、Snackbar、CoordinatorLayout、可折疊標題欄、SwipeRefreshLayout 下拉刷新、FloatingActionButt…

計算機網絡---http(超文本傳輸協議)

1. HTTP的定義與核心屬性 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本傳輸協議&#xff09;是萬維網&#xff08;WWW&#xff09;的核心通信協議&#xff0c;定義了客戶端&#xff08;如瀏覽器、APP&#xff09;與服務器之間如何傳輸“超文本”&#xff08…

【qml-7】qml與c++交互(自動補全提示)

背景&#xff1a; 【qml-5】qml與c交互&#xff08;類型單例&#xff09; 之前記錄過qml與c交互的方式&#xff0c;目前為止我使用的是“類型單例”方式。這些名字是我自己起的&#xff0c;只為說明問題&#xff0c;嚴謹的還是以手冊為準。 “類型單例”方式時提到過自動補全…

網頁提示UI操作-適應提示,警告,信息——仙盟創夢IDE

代碼<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生動態提示框</title><style>…

第八篇 永磁同步電機控制-MTPA、MTPV

永磁同步電機控制系列課程&#xff1a; 第一篇 永磁同步電機控制-認識電機 第二篇 永磁同步電機控制-電機的分類 第三篇 永磁同步電機控制-硬件基礎知識 第四篇 永磁同步電機控制-軟件基礎知識 第五篇 永磁同步電機控制-數學模型 第六篇 永磁同步電機控制-控制方法 第七…

JAVA:Spring Boot 集成 Temporal 實現訂單處理系統

?? 1、簡述 在現代分布式系統中,訂單處理涉及多步驟工作流(如庫存扣減、支付確認、物流派單等)。為了確保這些步驟的 可靠性、可觀測性 和 容錯性,我們可以使用 Temporal 實現工作流管理。 本文將介紹如何在 Spring Boot 中集成 Temporal,并通過一個訂單處理的實際案例…

服務器硬件電路設計之 SPI 問答(六):如何提升服務器硬件電路中的性能?如何強化穩定性?

在服務器 SPI 硬件設計中&#xff0c;通信性能&#xff08;如傳輸速率、數據吞吐量&#xff09;與穩定性&#xff08;抗干擾、誤碼率&#xff09;直接決定外設響應效率&#xff0c;需從硬件設計、參數配置、干擾抑制三方面系統優化。一、性能優化核心策略&#xff1a;根據 SPI …

Web 聊天室消息加解密方案詳解

目錄 ?編輯 一、Web 聊天室消息加解密需求與技術約束 1.1 核心安全需求 1.2 技術約束 二、主流消息加解密方案詳解 2.1 方案 1&#xff1a;對稱加密&#xff08;AES-256-GCM&#xff09; 2.1.1 方案概述 2.1.2 核心原理 2.1.3 實現步驟&#xff08;分場景&#xff09…

組合導航 | RTK、IMU與激光雷達組合導航算法:原理、實現與驗證

RTK、IMU與激光雷達組合導航算法:原理、實現與驗證 文章目錄 RTK、IMU與激光雷達組合導航算法:原理、實現與驗證 一、組合導航系統原理與數學模型 1.1 傳感器特性與互補性分析 1.2 系統狀態方程構建 1.3 多源觀測方程設計 (1)RTK觀測模型 (2)激光雷達觀測模型 (3)多源觀…

使用Cadence工具完成數模混合設計流程簡介

眾所周知&#xff0c;Cadence的Virtuoso是模擬設計領域的核心工具&#xff0c;市占率達到75%&#xff0c;隨著近些年來Cadence在數字版圖設計&#xff08;APR&#xff09;領域的崛起&#xff0c;invs&#xff0c;PVS等一眾工具也都成了很多公司的首選后端流程工具。依照強強聯合…

FunASR人工智能語音轉寫服務本地部署測試

前提條件&#xff1a;本機&#xff1a;windows11 &#xff0c;已安裝docker1.下載鏡像使用命令下載docker鏡像docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.13下載完成后&#xff0c;建立文件夾儲存之后需要下載的模型…

Python OpenCV圖像處理與深度學習

Python OpenCV圖像處理與深度學習 1. Python OpenCV入門&#xff1a;圖像處理基礎 2. Python OpenCV開發環境搭建與入門 3. Python OpenCV圖像處理基礎 4. Python OpenCV視頻處理入門 5. Python OpenCV圖像幾何變換入門 6. Python OpenCV圖像濾波入門 7. Python OpenCV邊緣檢測…

C# SIMD編程實踐:工業數據處理性能優化案例

性能奇跡的開始 想象一下這樣的場景&#xff1a;一臺精密的工業掃描設備每次檢測都會產生200萬個浮點數據&#xff0c;需要我們計算出最大值、最小值、平均值和方差來判斷工件是否合格。使用傳統的C#循環處理&#xff0c;每次計算需要幾秒鐘時間&#xff0c;嚴重影響生產線效率…

XHR 介紹及實踐

What is it? XML(XMLHttpRequest) 是瀏覽器提供的一種用于前端頁面和后端服務器進行異步通信的編程接口。它允許在不重新加載整個頁面的情況下&#xff0c;與服務器交換數據并更新部分頁面內容&#xff0c;是 AJAX 技術的核心。 What is it used for? 異步請求&#xff1a;在…

【量化回測】backtracker整體架構和使用示例

backtrader整體框架 backtrader 是一個量化回測的庫&#xff0c;支持多品種、多策略、多周期的回測和交易。更重要的是可以集成 torch 等神經網絡分析模塊。Cerebro類是 backtrader 的核心。Strategy類、Broker和Sizer類都是由Cerebro類實例化而來。 整體流程 backtrade 自帶的…

【python+requests】一鍵切換測試環境:Windows 下環境變量設置指南

一鍵切換測試環境&#xff1a;Windows 下環境變量設置指南教你如何通過一個命令讓測試腳本自動識別不同環境的配置文件你是否遇到過這種情況&#xff1a;同一套測試腳本&#xff0c;需要在測試環境、開發環境、預發布環境、生產環境等多種配置中切換&#xff1f;每次都要手動修…