學會使用 Redis 的一個重要內容就是 Redis 的數據類型,對於開發人員而言,學會 Redis 基礎數據類型的使用即可應用到程式開發當中。 ...
簡介
根據 官網文檔 的解釋,可以瞭解 Redis 基礎數據類型的一些基本信息:
對於 Redis 來說,存儲的 key 值都是字元串類型,討論數據類型的時候,指的都是存儲的 value 值。這裡主要是包括 5 種數據類型:String、List、Set、Hash、SortedSet。
如果想要瞭解 Redis 基礎數據類型支持的命令,可以查看 官方文檔,篩選對應數據類型即可。
String
String 是最基本的 Redis 數據類型,其是二進位安全的,這表示 String 可以存儲任何類型的數據,如字元串、數字、圖片、序列化對象等等。
官方文檔 提供了部分對 String 數據類型的說明,具體 String 數據類型支持的命令也可以通過訪問 這裡 查看。
有一點需要註意,String 數據類型最高支持存儲 512MB 長度的數據。
通常情況,String 數據類型會使用在以下場景:
- 數據緩存:直接存儲字元串、序列化數據、圖片、視頻等數據
- 計數器:使用
INCRBY
這樣的增量命令實現原子計數器 - 分散式鎖:使用多參數的
SET
命令實現分散式鎖
List
Redis 的 List 數據類型是一個雙端鏈表,因此 List 隨機存取的效率比較低,不過可以像使用鏈表一樣實現鏈式棧、鏈式隊列等功能。
官方文檔 提供了部分對 List 數據類型的說明,具體 List 數據類型支持的命令也可以通過訪問 這裡 查看。
有一點需要註意,List 數據類型最大支持存儲 \(2^{32} - 1\)(約 42 億) 個元素。
通常情況,List 數據類型會使用在以下場景:
- 棧:聯合使用
LPUSH
命令和LPOP
命令即可實現棧 - 隊列:聯合使用
LPUSH
命令和RPOP
命令即可實現隊列 - 有限集合:聯合使用
LPUSH
命令和LTRIM
命令即可實現有限集合 - 消息隊列:聯合使用
LPUSH
命令和BRPOP
命令即可實現延時消息隊列
Set
Set 是一個無序不重覆集合,並且現有命令實現集合的交集、並集、差集等功能,但頻繁使用這些功能會影響 Redis 伺服器的性能,建議謹慎使用。
官方文檔 提供了部分對 Set 數據類型的說明,具體 Set 數據類型支持的命令也可以通過訪問 這裡 查看。
同 List 數據類型一樣,Set 數據類型最大支持存儲 \(2^{32} - 1\)(約 42 億) 個元素。
通常情況,Set 數據類型會使用在以下場景:
- 標簽:不同的標簽存儲在不同集合中,既可以查詢是否存在相同標簽,也可以聚合不同標簽
- 共同好友:不同用戶的好友存儲在不同集合中,使用交集可以得到共同好友
- 獨立 IP:利用 Set 的元素唯一性,可以快速實時統計網站的獨立 IP
Hash
Redis 的 Hash 數據類型存儲著字元串 field 和字元串 value 的映射關係,特別適合存儲 key-value 結構。
官方文檔 提供了部分對 Hash 數據類型的說明,具體 Hash 數據類型支持的命令也可以通過訪問 這裡 查看。
每個 Hash 數據類型最多可以存儲 \(2^{32} - 1\)(約 42 億) 個鍵值對,實際上,Hash 數據類型僅受 Redis 所部署的記憶體限制。
通常情況,Hash 數據類型會使用在以下場景:
- 數據緩存:對比於存儲 JSON 字元串的 String 類型,Hash 更直觀、更節省空間、更靈活
SortedSet
SortedSet 數據類型有點類似於 Set 數據類型,不同之處在於 SortedSet 數據類型支持按照給定的分數對數據進行排序。
SortedSet 中的集合通過哈希表實現,在實際使用中,添加、刪除、查找的效率都非常高。
官方文檔 提供了部分對 Hash 數據類型的說明,具體 Hash 數據類型支持的命令也可以通過訪問 這裡 查看。
大多數 SortedSet 操作的複雜度是 O(log(N)),其中 N 是成員數。部分批量查詢命令的時間複雜度可以達到 O(log(N) + M),這裡的 M 是返回的結果數。
通常情況,SortedSet 數據類型會使用在以下場景:
- 排行榜:排行榜需要按照某個規則排序,將這個規則值存儲成分數,即可實現排行榜的功能
- 權重隊列:通過將任務的權重存儲成分數,工作線程可以按照分數的倒序來獲取工作任務
其他數據類型
Redis 中最常見的數據類型就是 String、List、Set、Hash、SortedSet 這 5 種,也是最初支持的數據類型。
當然,Redis 也有一些不常見、卻適用於特殊場景的數據類型,瞭解這些數據類型也是很必要的。
Stream 是 Redis 5.0 版本新增的數據類型,其本身類似於 append-only 日誌。實際上給 Redis 的發佈、訂閱功能提供了持久化和主備複製功能,可以讓任何客戶端訪問任何時刻的數據,並且能記住每一個客戶端的訪問位置,還能保證消息不丟失。
Geospatial 是 Redis 3.2 版本新增的數據類型,此類型主要用於存儲地理位置信息,並且 Redis 提供了常見的地理位置查詢命令。
HyperLogLog 是 Redis 2.8.9 版本新增的數據類型,主要用於做基數統計的演算法。其使用不超過 12 KB 的存儲,且僅達到 0.81% 的標準錯誤率,應用場景也是十分特殊。
Bitmap 是 String 數據類型的擴展,是定義在 String 數據類型上的面向位的操作,其最大的優點是當存儲信息時可以節省極大的空間。