Redis支持的基本數據類型:String、hash、list、Set、Zset
一、String
特點
- 可以存儲三種類型 int、float、string
運用場景
- 緩存:存儲HTML片段、用戶會話(Session)
- 計數器:網站訪問量、點贊數(incr方法)。允許一定的延遲,先寫入Redis再定時同步到數據庫
- 限流:以訪問者的IP和其他信息作為KEY,訪問一次增加一次技術,超過次數返回false
- 分布式鎖:通過SETNX實現簡單鎖機制。
二、Hash
- 特點:
- Hash用來存儲多個無序的鍵值對。最大存儲數量2^32 - 1 (40億左右)
- 鍵值對集合,適合存儲對象(如用戶信息)。
- 支持單獨操作某個字段(如 HSET user:1 age 30),避免序列化整個對象。
- 底層使用壓縮列表(小數據)或哈希表(大數據),內存高效。
- 優點:
- ?把所有相關的值都聚集到一個key中,節省內存空間
- 只是用一個key,減少key沖突
- 當需要批量獲取值的時候,只需要使用一個命令,減少內存/IO/CPU的消耗
- 缺點:
- Field 不能單獨設置過期時間
- 需要考慮數據量分布的問題(field非常多的時候,無法分布到多個節點)
- 使用場景
- String能做的Hash都能做
對象存儲:用戶信息、商品詳情(字段可部分更新)。
配置管理:系統配置項按組存儲,便于批量獲取。
????????
三、List
- 特點:
- 基于雙向鏈表實現,支持在頭部和尾部快速 插入/刪除元素(時間復雜度 O(1))。
- 元素可以重復,按插入順序排列。
- 可以通過索引訪問,但是中間操作效率低(時間復雜度O(n))。
- 常用命令
- lpush + lpop = Stack (棧)
- lpush + rpop = Queue (隊列)
- lpush + ltrim = Capped Collection (有限集合)
- lpush + brpop = Message Queue (消息隊列)
- 阻塞的彈出操作:blpop / brpop,可以設置超時時間(單位:秒)
- blpop:blpop key1 timeout,移除并獲取列表第一個元素,如果列表沒有元素會阻塞列表,直到等待超時或發現可彈出元素為止。
- brpop:brpop key1 timeout,移除并獲取列表最后一個元素,如果列表沒有元素會阻塞列表,直到等待超時或發現可彈出元素位置。
- 使用場景
- 消息隊列:生產者通過 lpush 推送消息,消費者通過 rpop 拉取(需輪詢,建議使用Stream類型代替。
- 最新動態:存儲用戶的最新文章、評論(如 lpush+ltrim 保持固定長度)。
- 阻塞隊列:使用 blpop / brpop 實現阻塞式讀取。
四、Set
- 特點:
- 無序 且 元素唯一(自動去重)
- 支持集合運算(交集-sinter、并集-sunion、差集-sdiff)
- 查詢元素是否存在 - 時間復雜度為O(1)。
- 使用場景
標簽系統:用戶興趣標簽(SADD user:1:tags tag1 tag2)。
唯一性約束:統計文章的唯一閱讀用戶。點贊、簽到、打卡。
社交關系:共同關注(交集)、可能認識的人(差集)。
五、有序集合-Zset
- 特點
- 元素唯一,每個元素關聯一個score(分數)用于排序
- 按 score 升序排列,支持范圍查詢(如 ZrangeByScore)。
- 底層使用跳躍表和哈希表,保證高效查詢和排序。
- 使用場景
- 排行榜:游戲積分排名、熱搜榜(按score排序)。
- 延遲隊列:將任務到期時間作為score,定時輪詢獲取到期任務。
- 帶權重的隊列:優先處理高優先級的任務。