[Redis]ZSet

Duancf發表於2024-07-06

透過value查score

在Redis的有序集合(zset)中,透過成員(member)獲取其對應的分數(score)的複雜度是 O(log N),其中 N 是有序集合中的元素數量。

這是因為 Redis 使用跳躍表(skip list)和雜湊表(hash table)的組合來實現有序集合。跳躍表用於按順序儲存元素,以便高效地按分數排序和查詢範圍,而雜湊表用於透過成員快速查詢其對應的分數。

詳細分析

  1. 跳躍表

    • 跳躍表是一種多層級的連結串列結構,允許快速查詢、插入和刪除操作。
    • 在最壞情況下,跳躍表的查詢時間複雜度為 O(log N)。
  2. 雜湊表

    • 雜湊表用於透過成員名快速查詢元素。
    • 透過成員名查詢元素的時間複雜度為 O(1)。
    • Redis在zset中維護一個雜湊表,記錄每個成員與其對應的分數。

操作流程

當你透過成員名來獲取其分數時,Redis會執行以下步驟:

  1. 在雜湊表中查詢成員名
    • 由於雜湊表的查詢複雜度為 O(1),這一步非常快速。
    • 雜湊表會返回該成員的分數。

因此,總的複雜度取決於雜湊表查詢的複雜度,即 O(1)。但由於 zset 內部實現維護的結構包含跳躍表,嚴格來說獲取 score 仍然需要維護平衡狀態。

具體命令

在 Redis 中,透過成員獲取分數的命令是 ZSCORE

ZSCORE key member

示例

假設有一個 zset 儲存在鍵 myzset 中,幷包含以下成員和分數:

ZADD myzset 1 "one"
ZADD myzset 2 "two"
ZADD myzset 3 "three"

要獲取成員 two 的分數,可以使用以下命令:

ZSCORE myzset "two"

返回結果為 2

總結

透過成員名獲取其分數的操作主要依賴於雜湊表的查詢,因此其複雜度為 O(1)。雖然跳躍表用於維護有序集合的順序和範圍查詢,但在這種具體操作中,它的影響可以忽略不計。

相關文章