? String:字符串(最常用、最簡單的類型)
📌 應用場景:
- 計數器
(如:頁面瀏覽量、點贊數、轉發數等)
- 緩存單個值
(如:token、驗證碼、用戶昵稱)
- 分布式鎖
🔧 使用方式:
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:列表(有序,可重復)
📌 應用場景:
- 消息隊列
(簡單隊列)
- 任務列表 / 待辦事項
- 文章評論列表(按時間排序)
- 最近瀏覽記錄
🔧 使用方式:
RPUSH task:pending task1
LPUSH comments:article:123?"這是一條評論"
LPOP task:pending
LRANGE task:pending 0 9
🧠 原理:
底層使用?QuickList(壓縮列表+雙向鏈表的混合體)
插入和刪除效率高,尤其適合兩端操作
? 優點:
插入/讀取非常快,適合隊列結構
支持阻塞讀寫(BLPOP)
?? 缺點與建議:
- 不支持多消費者分發消息
,同一條消息無法被多個消費者消費
更復雜的消息隊列場景建議使用 Redis Stream
? Hash:哈希(類似 Java Map)
📌 應用場景:
- 購物車
(key = 用戶,field = 商品ID,value = 數量)
- 緩存對象結構數據(用戶信息、商品信息)
- 表單臨時存儲、會話信息等結構化數據
🔧 使用方式:
HSET cart:user:1001 10001 2
HSET user:1001 name?"張三"?age 18
HGETALL cart:user:1001
🧠 原理:
少字段時用?ListPack(壓縮結構)?節省內存
字段多或數據復雜時切換為?HashTable
? 優點:
適合結構化數據:一個 Key 下多個字段
節省內存,訪問效率高
?? 建議:
可結合 JSON 序列化在字段 value 存更多屬性
使用時建議一個用戶一個 key,方便管理和清理
? Set:集合(無序、唯一)
📌 應用場景:
- 點贊功能(去重)
- 標簽系統(興趣標簽)
- 共同關注 / 好友關系運算
- 在線用戶列表
🔧 使用方式:
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):有序集合
📌 應用場景:
- 排行榜系統(根據分數排名)
- 延遲隊列(score = 時間戳)
- 熱門文章 / 熱門話題
🔧 使用方式:
ZADD rank:game 200 user1001
ZADD rank:game 300 user1002
ZRANGE rank:game 0 -1 WITHSCORES
ZREVRANK rank:game user1001
🧠 原理:
由?跳表(SkipList)+ 哈希表?構成
按照 score 排序插入,查詢時效率高
? 優點:
能支持快速按 score 排序、范圍查詢
適合動態排行榜、分數管理、計時任務處理等
? BitMap:位圖
📌 應用場景:
- 用戶簽到統計
- 用戶是否登錄、是否活躍
- 某個功能是否開啟(布爾狀態)
🔧 使用方式:
SETBIT sign:20250715 1001 1
GETBIT sign:20250715 1001
BITCOUNT sign:20250715
🧠 原理:
本質是字符串,內部按位存儲,1bit 表示一個狀態
占用空間極小,適合高并發、大用戶量場景
? 優點:
超省空間,100萬用戶只占約125KB
適合做大規模布爾值存儲(狀態標記)
? HyperLogLog:概率計數器
📌 應用場景:
- UV(獨立用戶訪問數)統計
- 粗略的唯一元素去重計數
🔧 使用方式:
PFADD uv:20250715 user1001
PFCOUNT uv:20250715
🧠 原理:
使用概率算法 HyperLogLog 估算基數
精度在 0.81% 左右,空間固定 12KB
? 優點:
超省內存,可統計上億級唯一值
精度足以滿足大多數運營分析需求
?? 缺點:
- 不支持具體去重數據查看
(只能知道有多少,不知道是誰)
不適合對精度要求嚴格的計數
? GEO:地理位置
📌 應用場景:
- 查找附近的人/店
- 定位服務
- 地理范圍篩選
🔧 使用方式:
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:消息隊列(高級)
📌 應用場景:
- 異步消息處理(類似 Kafka)
- 訂單流轉、日志收集
- 多消費者消費模型
🔧 使用方式:
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 | 高級消息隊列 | 多消費者、持久化 | 實時任務、日志 |