Redis 會將每個鍵與一種資料型別建立關聯。對型別錯誤的鍵執行命令 會失敗,因此鍵的命名與值的所有權應明確呈現資料模型。
Redis 會在伺服器執行緒上以不可分割方式執行每個命令。因此,
INCR、HSET、SADD 與 ZADD 等單一命令可安全地變更單一鍵的
狀態,但若多步驟的讀取—修改—寫入序列必須作為一個單元運作,
就需要使用 MULTI/EXEC、WATCH 或 Lua。
鍵的生命週期 #
DEL 會同步回收值,且處理大型聚合資料時可能阻塞。UNLINK 會將鍵
分離,並讓 Redis 非同步回收記憶體。使用 EXPIRE、PEXPIRE、TTL
與 PTTL 設定及檢查到期時間;對沒有到期時間的鍵,TTL 傳回 -1,
對不存在的鍵則傳回 -2。
不要對正式環境規模的鍵空間使用 KEYS *,因為它會以單一命令掃描
整個鍵空間。改用 SCAN 反覆巡訪:
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 上閱讀或評論(發表評論需要登入)