Redis

2023-03-22 12:02:52

簡介

根據 官網檔案 的解釋,可以瞭解 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 資料型別上的面向位的操作,其最大的優點是當儲存資訊時可以節省極大的空間。