Redis 資料型別與命令

最後更新: 2024-01-02 17:43:06 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

Redis 會將每個鍵與一種資料型別建立關聯。對型別錯誤的鍵執行命令 會失敗,因此鍵的命名與值的所有權應明確呈現資料模型。

Redis 會在伺服器執行緒上以不可分割方式執行每個命令。因此, INCR、HSET、SADD 與 ZADD 等單一命令可安全地變更單一鍵的 狀態,但若多步驟的讀取—修改—寫入序列必須作為一個單元運作, 就需要使用 MULTI/EXEC、WATCH 或 Lua。

鍵的生命週期 #

DEL 會同步回收值,且處理大型聚合資料時可能阻塞。UNLINK 會將鍵 分離,並讓 Redis 非同步回收記憶體。使用 EXPIRE、PEXPIRE、TTL 與 PTTL 設定及檢查到期時間;對沒有到期時間的鍵,TTL 傳回 -1, 對不存在的鍵則傳回 -2。

不要對正式環境規模的鍵空間使用 KEYS *,因為它會以單一命令掃描 整個鍵空間。改用 SCAN 反覆巡訪:

redis
SCAN 0 MATCH user:* COUNT 1000

持續執行,直到傳回的游標為 0。掃描可能傳回重複項目,也可能漏掉 巡訪期間建立或刪除的鍵;若呼叫端要求結果不重複,就必須自行去除重複項目。

核心型別 #

  • 字串支援 GET、SET、不可分割的 INCRBY,以及二進位安全的值。
  • 串列是具有順序、可從左側或右側索引的集合,適合用於佇列與 工作串流。LPUSH 與 RPUSH 會將項目加入開頭或結尾;LPOP 與 RPOP 會在空串列上傳回 nil,並在最後一個元素消失時移除該鍵。 BLPOP 與 BRPOP 會阻塞,直到列出的其中一個鍵變為非空。 LRANGE 的兩端均為包含端點,且接受從尾端起算的負數索引; 不受限的範圍可能傳回非常大的承載資料。RPOPLPUSH 與 BRPOPLPUSH 會以不可分割方式將一個尾端元素移至另一個串列。
  • 集合包含不重複的成員,並透過雜湊表測試成員資格。可使用 SADD、SREM、SCARD、SISMEMBER、SMEMBERS、SPOP 與 SRANDMEMBER。SINTER、SUNION 與 SDIFF 等集合代數命令 會讀取輸入但不修改它們;*STORE 變體則會以不可分割方式取代 目的集合。
  • 排序集合會為每個不重複的成員關聯一個浮點數分數。 ZADD 以不可分割方式新增或更新成員,因此重複的成員會取代 先前的分數,而不會建立重複項目。使用 ZRANGE、ZREVRANGE、 ZRANK、ZREVRANK 與分數範圍命令進行排序查詢,並使用 ZREM 或 ZREMRANGEBYRANK/ZREMRANGEBYSCORE 移除項目。
  • 雜湊會將欄位/值配對群組在一個鍵下。HSET 會以不可分割方式 建立或更新欄位;HGET、HMGET、HDEL、HINCRBY 與 HGETALL 會對具名欄位運作,而非巢狀物件。HGETALL 的結果可能很大,因此 只需少數欄位時應優先採用針對性讀取。
  • 串流會以有序 ID 附加欄位/值項目。XADD 寫入項目, XRANGE 讀取 ID 範圍,而 XREAD 會等待游標之後的項目。 消費者群組使用 XREADGROUP 分配項目;消費者必須以 XACK 確認完成的工作,並主動回收遭放棄的待處理項目。串流是持久性 資料結構,不是暫時性的 Pub/Sub 傳遞。

HGETALL、SMEMBERS 與不受限的 LRANGE 會傳回所有元素,且可能 產生大型回應。請在請求路徑中使用以游標為基礎的雜湊/集合掃描或 有界範圍。

MULTI 會將命令排入佇列,EXEC 則會執行這些命令,期間不會穿插 其他用戶端的命令,但 Redis 交易不提供 SQL 式回復。同一個 EXEC 中的某個佇列命令發生執行階段錯誤時,不會復原其他成功的命令。 WATCH 會加入樂觀衝突偵測。Lua 指令碼與 Redis Functions 相對於 其他命令會以不可分割方式執行,因此其執行時間必須有界,因為長時間 執行會阻礙伺服器進度。

機率式計數 #

HyperLogLog 值使用 PFADD 接受觀測資料,並以 PFCOUNT 估算基數。 Redis 文件記載其標準誤差小於 1%,密集表示法最多占用 12 KiB; 它以精確度與成員列舉能力換取有界記憶體用量。PFMERGE 會合併 相容的觀測資料。需要精確成員清單時應使用集合;只有在近似計數 符合產品契約時才使用 HyperLogLog。

參考資料 #

評論

在 GitHub 上閱讀或評論(發表評論需要登入)