Redis都有哪些數據結構,使用場景與原理解析

? String:字符串(最常用、最簡單的類型)

📌 應用場景:

  1. 計數器

    (如:頁面瀏覽量、點贊數、轉發數等)

  2. 緩存單個值

    (如:token、驗證碼、用戶昵稱)

  3. 分布式鎖

🔧 使用方式:

SET user:1001?"張三"
SET token:abcd1234?"user1001"
INCR page:views
SET lock:order123 1 NX EX 30

🧠 原理:

  • 底層是?SDS(Simple Dynamic String)簡單動態字符串

  • 是 Redis 自定義的字符串類型,支持動態擴容、安全、長度記錄

? 優點:

  • 使用簡單,幾乎所有業務都可以上手

  • 支持數值加減操作,適合做計數器

  • 原子性強,適合做分布式鎖

?? 缺點與建議:

  • 分布式鎖建議用 Redisson、RedLock 來避免失效風險

  • 不適合存儲結構化數據(比如對象或數組)


? List:列表(有序,可重復)

📌 應用場景:

  1. 消息隊列

    (簡單隊列)

  2. 任務列表 / 待辦事項
  3. 文章評論列表(按時間排序)
  4. 最近瀏覽記錄

🔧 使用方式:

RPUSH task:pending task1
LPUSH comments:article:123?"這是一條評論"
LPOP task:pending
LRANGE task:pending 0 9

🧠 原理:

  • 底層使用?QuickList(壓縮列表+雙向鏈表的混合體)

  • 插入和刪除效率高,尤其適合兩端操作

? 優點:

  • 插入/讀取非常快,適合隊列結構

  • 支持阻塞讀寫(BLPOP)

?? 缺點與建議:

  • 不支持多消費者分發消息

    ,同一條消息無法被多個消費者消費

  • 更復雜的消息隊列場景建議使用 Redis Stream


? Hash:哈希(類似 Java Map)

📌 應用場景:

  1. 購物車

    (key = 用戶,field = 商品ID,value = 數量)

  2. 緩存對象結構數據(用戶信息、商品信息)
  3. 表單臨時存儲、會話信息等結構化數據

🔧 使用方式:

HSET cart:user:1001 10001 2
HSET user:1001 name?"張三"?age 18
HGETALL cart:user:1001

🧠 原理:

  • 少字段時用?ListPack(壓縮結構)?節省內存

  • 字段多或數據復雜時切換為?HashTable

? 優點:

  • 適合結構化數據:一個 Key 下多個字段

  • 節省內存,訪問效率高

?? 建議:

  • 可結合 JSON 序列化在字段 value 存更多屬性

  • 使用時建議一個用戶一個 key,方便管理和清理


? Set:集合(無序、唯一)

📌 應用場景:

  1. 點贊功能(去重)
  2. 標簽系統(興趣標簽)
  3. 共同關注 / 好友關系運算
  4. 在線用戶列表

🔧 使用方式:

SADD like:article:123 user1001
SREM like:article:123 user1001
SISMEMBER like:article:123 user1001
SCARD like:article:123
SINTER user:1001:friends user:1002:friends

🧠 原理:

  • 底層是哈希表結構,插入/查找都是 O(1)

  • 元素唯一,自動去重

  • 支持交集、并集、差集等集合運算

? 優點:

  • 非常適合“去重”場景

  • 集合運算支持高級分析(如共同點贊、共同好友)

?? 建議:

  • 不能存重復數據,若需要統計次數,用 Hash 或 ZSet 替代


? ZSet(Sorted Set):有序集合

📌 應用場景:

  1. 排行榜系統(根據分數排名)
  2. 延遲隊列(score = 時間戳)
  3. 熱門文章 / 熱門話題

🔧 使用方式:

ZADD rank:game 200 user1001
ZADD rank:game 300 user1002
ZRANGE rank:game 0 -1 WITHSCORES
ZREVRANK rank:game user1001

🧠 原理:

  • 由?跳表(SkipList)+ 哈希表?構成

  • 按照 score 排序插入,查詢時效率高

? 優點:

  • 能支持快速按 score 排序、范圍查詢

  • 適合動態排行榜、分數管理、計時任務處理等


? BitMap:位圖

📌 應用場景:

  1. 用戶簽到統計
  2. 用戶是否登錄、是否活躍
  3. 某個功能是否開啟(布爾狀態)

🔧 使用方式:

SETBIT sign:20250715 1001 1
GETBIT sign:20250715 1001
BITCOUNT sign:20250715

🧠 原理:

  • 本質是字符串,內部按位存儲,1bit 表示一個狀態

  • 占用空間極小,適合高并發、大用戶量場景

? 優點:

  • 超省空間,100萬用戶只占約125KB

  • 適合做大規模布爾值存儲(狀態標記)


? HyperLogLog:概率計數器

📌 應用場景:

  1. UV(獨立用戶訪問數)統計
  2. 粗略的唯一元素去重計數

🔧 使用方式:

PFADD uv:20250715 user1001
PFCOUNT uv:20250715

🧠 原理:

  • 使用概率算法 HyperLogLog 估算基數

  • 精度在 0.81% 左右,空間固定 12KB

? 優點:

  • 超省內存,可統計上億級唯一值

  • 精度足以滿足大多數運營分析需求

?? 缺點:

  • 不支持具體去重數據查看

    (只能知道有多少,不知道是誰)

  • 不適合對精度要求嚴格的計數


? GEO:地理位置

📌 應用場景:

  1. 查找附近的人/店
  2. 定位服務
  3. 地理范圍篩選

🔧 使用方式:

GEOADD store:city 120.38 36.06 store1
GEORADIUS store:city 120.38 36.06 5 km
GEODIST store:city store1 store2 km

🧠 原理:

  • Redis GEO 底層使用 ZSet,score 是地理位置轉為整數 score 的編碼值

  • 查詢時轉換為范圍查詢

? 優點:

  • 精度高、效率快

  • 查詢方便,結合 ZSet 進行范圍定位


? Stream:消息隊列(高級)

📌 應用場景:

  1. 異步消息處理(類似 Kafka)
  2. 訂單流轉、日志收集
  3. 多消費者消費模型

🔧 使用方式:

XADD order:stream * orderId 123 status created
XREAD COUNT 1 STREAMS order:stream 0
XGROUP CREATE order:stream group1 $
XREADGROUP GROUP group1 consumer1 STREAMS order:stream >

🧠 原理:

  • 內部使用?RadixTree + ListPack?高效存儲

  • 每條消息是一個有序條目(ID 唯一),支持消費確認

  • 支持消費者組,保證“每個消息分發給一個消費者”

? 優點:

  • 支持持久化、多消費者、消息確認

  • 是 Redis 中真正的消息隊列結構,功能完善

?? 建議:

  • 替代 List 做消息隊列

  • 對性能和可靠性要求高時優選


? 整體對比表(一句話總結)

數據結構

應用場景

特點

適用關鍵詞

String

單值緩存、計數、鎖

簡單高效

計數器、token、驗證碼

Hash

對象、購物車

結構化、節省空間

多字段數據

List

隊列、評論

有序、支持阻塞

先進先出、任務隊列

Set

點贊、關注

唯一、支持集合運算

去重、關系運算

ZSet

排行榜、延遲隊列

有序、按分數排序

熱門排序

BitMap

簽到、狀態

位運算、極省空間

用戶標記

HyperLogLog

UV統計

概率估算

大規模去重

GEO

附近的人

經緯度范圍查詢

LBS服務

Stream

高級消息隊列

多消費者、持久化

實時任務、日志

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

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

相關文章

將EXCEL或者CSV轉換為鍵值對形式的Markdown文件

# 創建命令行參數解析器parser argparse.ArgumentParser(description將 CSV 或 Excel 文件轉換為帶標頭的 Markdown 格式)# 必需參數parser.add_argument(input_file, help輸入文件路徑 (CSV 或 Excel))parser.add_argument(output_file, help輸出 Markdown 文件路徑)# 可選參…

MySQL 配置性能優化實操指南:分版本5.7和8.0適配方案

在 MySQL 性能優化中,不同版本的特性差異會直接影響優化效果。本文基于 MySQL 5.7 和 8.0 兩個主流版本,通過版本適配的配置代碼、場景舉例和通俗解釋,讓優化方案更精準落地。一、硬件與系統配置優化(基礎層優化)1. 服…

【STM32實踐篇】:串口通信

文章目錄1. 串行通信與并行通信2. 異步通信與同步通信3. 單工,半雙工和全雙工通信4. 通信速率和接口標準5. USART 結構框圖6. 串口電路6.1 串口之間的連接6.2 串口與 RS232 的轉換和連接6.3 串口與 RS485 的轉換和連接6.4 串口與 USB 的轉換和連接7. USART 字符說明…

Trae IDE評測體驗:通過 MCP Server - Figma AI Bridge 一鍵將 Figma 轉為前端代碼

Trae IDE評測體驗:通過 MCP Server - Figma AI Bridge 一鍵將 Figma 轉為前端代碼 在現代前端開發中,從設計稿到可用頁面的交付往往需要大量重復勞動:切圖、手寫樣式、布局調整……而借助 MCP Server - Figma AI Bridge,我們可以…

文獻閱讀 250715-Atmospheric rivers cause warm winters and extreme heat events

Atmospheric rivers cause warm winters and extreme heat events 來自 <Atmospheric rivers cause warm winters and extreme heat events | Nature> ## Abstract: Definition: Atmospheric rivers (ARs) are narrow regions of intense water vapour transport in the …

線上協同辦公時代:以開源AI大模型等工具培養網感,擁抱職業變革

摘要&#xff1a;在提倡線上協同辦公的時代背景下&#xff0c;職場人需迅速提升工作能力以適應職業變革。培養網感成為時代所需&#xff0c;它為快速連接時代奠定基礎。本文深入探討了開源AI大模型、AI智能名片、S2B2C商城小程序源碼等工具在培養網感過程中的重要作用&#xff…

Netty網絡聊天室及擴展序列化算法

一、前言Netty是一個基于Java的高性能、事件驅動的網絡應用框架&#xff0c;廣泛應用于各種網絡通信場景。本文將介紹如何使用Netty構建一個簡單的網絡聊天室&#xff0c;并擴展序列化算法來提高數據傳輸效率和靈活性。二、Netty網絡聊天室的實現1. 項目結構我們將使用Maven構建…

基于單片機金沙河糧倉環境監測系統設計與實現

摘 要 本文圍繞基于單片機的金沙河糧倉環境監測系統展開設計與實現研究。系統以單片機為核心&#xff0c;集成 DHT11、MQ - 135 等傳感器&#xff0c;可實時精準監測糧倉溫濕度、氣體成分等關鍵環境參數。借助 LoRa、ESP8266 實現數據的可靠傳輸與遠程通信 &#xff0c;OLED 屏…

如何解決Android Studio安裝時無法下載SDK的問題(Windows、Linux、Mac解決方案大全)

如何解決Android Studio安裝時無法下載SDK的問題&#xff08;Windows、Linux、Mac解決方案大全&#xff09; 前言 對于全棧開發者而言&#xff0c;安裝 Android Studio 是邁向 Android 開發的第一步&#xff0c;但在 Windows、Linux、macOS 等不同平臺上&#xff0c;經常會遇…

SQL Server從入門到項目實踐(超值版)讀書筆記 21

9.5 數據的內連接查詢連接是關系數據庫模型的主要特點&#xff0c;連接查詢是關系數據庫中最主要的查詢&#xff0c;主要包括內連接、外連接等。內連接查詢操作列出與連接條件匹配的數據行&#xff0c;它使用比較運算符比較被鏈接列的列值。具體語法格式如下&#xff1a;SELECT…

瑞芯微7月17日舉辦開發者大會,多款AIoT新品發布,觸覺智能RK方案商報導

瑞芯微第九屆開發者大會RKDC 2025將有多款新品發布。 據瑞芯微電子Rockchip此前宣布&#xff1a;該企業的本年度開發者大會RKDC 2025將于7月17~18日在福建福州海峽國際會展中心舉行。本次瑞芯微開發者大會以“AIoT模型創新重做產品”為主題&#xff0c;關注傳統IoT功能設備向場…

Eureka+Ribbon實現服務注冊與發現

目錄 一、相關文章 二、兼容說明 三、服務注冊 四、服務發現 一、相關文章 基礎工程&#xff1a;gradle7.6.1springboot3.2.4創建微服務工程-CSDN博客 Eureka服務端啟動&#xff1a;https://blog.csdn.net/cherishSpring/article/details/149473554 Ribbon負載均衡&#…

數據庫、HTML

一、數據庫 數據庫文件與普通文件區別: 普通文件對數據管理(增刪改查)效率低2.數據庫對數據管理效率高&#xff0c;使用方便 常用數據庫: 1.關系型數據庫: 將復雜的數據結構簡化為二維表格形式 大型:0racle、DB2 中型:MySq1、sQLServer 小型:Sqlite 2.非關系型數據庫以鍵值對…

RCE隨筆(1)

哪些是可以執行代碼執行&#xff1a;php代碼。eval如&#xff1a;eval:<?php eval($_post[key]);eval&#xff1a;php中不被叫做函數叫動態執行命令assert&#xff1a;執行函數call_user_func_array<?php call_user_func_array(assert,array($_REQUEST[shu]));傳入xxs-…

FPGA——ZYNQ7020學習日記(PS端)4(開始PS控制VGA顯示)

1.DMA 我們的整體VGA顯示分為幾步&#xff1a;比如先導入VIDEO TIMING CONTROL來做對輸入數據的時序“對齊”&#xff0c;這里開源騷客寫的很詳細&#xff0c;先用了一個虛擬IO&#xff08;VIO)來作為輸入&#xff0c;導入了一個簡單的RTL模塊&#xff08;當VTL的使能信號有效…

AGX Xavier 搭建360環視教程【補充一:魚眼去畸變(Fisheye Undistortion)】

對每路幀做魚眼去畸變除了用cv::cuda::remap是否有更好的辦法呢&#xff1f;確實 cv::cuda::remap 不是唯一可選項&#xff0c;甚至未必是最高效或最適合實際業務量級的方案。&#x1f3af; 1?? 去畸變的原理魚眼相機&#xff08;或者大廣角相機&#xff09;會把直線拉彎&…

tomato靶機練習

下載完靶機后&#xff0c;直接運行&#xff0c;選擇安裝路徑后將虛擬機的網絡設置為nat模式&#xff0c;設置完成后重啟虛擬機掃描同一網段&#xff0c;查找主機&#xff0c;這里我們使用kali的nmap&#xff0c;既能找到主機&#xff0c;也能查看開啟的端口依次嘗試&#xff0c…

136. Java 泛型 - 下限通配符

文章目錄136. Java 泛型 - 下限通配符 (? super T)**1. 什么是下限通配符 (? super T)&#xff1f;****2. 為什么使用下限通配符&#xff1f;****3. 示例&#xff1a;使用 ? super Integer 允許添加 Integer****? 正確示例****4. 為什么 List<? super Integer> 和 L…

C++23中的std::expected:異常處理

C23中的std::expected:異常處理 眾所周知&#xff0c;C23以前的異常處理是比較麻煩的&#xff0c;尤其是自己要在可能拋出異常的地方&#xff0c;需要自己去捕獲它&#xff0c;比如除數為0的異常、使用std::stoi函數將字符串轉換成int整型數據、處理文件讀寫的異常等等&#x…

處理Electron Builder 創建新進程錯誤 spawn ENOMEM

這個錯誤 spawn ENOMEM 表明系統內存不足&#xff0c;無法為 Electron Builder 創建新進程。以下是一些可能的解決方案&#xff1a;釋放系統內存關閉不必要的程序和服務增加物理內存 (RAM) 或交換空間 (swap)使用 free -h 和 top 命令檢查內存使用情況臨時增加交換空間# 創建一…