redis基本資料結構之ZSet

2021-10-03 20:12:44 字數 1329 閱讀 1691

zset資料結構類似於set結構,只是zset結構中,每個元素都會有乙個分值,然後所有元素按照分值的大小進行排列,相當於是乙個進行了排序的鍊錶。

如果zset是乙個鍊錶,而且內部元素是有序的,在進行元素插入和刪除,以及查詢的時候,就必須要遍歷鍊錶才行,時間複雜度就達到了o(n),這個在以單執行緒處理的redis中是不能接受的。所以zset採用了一種跳躍表的實現。這個實現有點類似於kafka儲存訊息是使用的稀疏索引,kafka這個相對較簡單,可以用來介紹模擬學習。

如果熟悉kafka,就知道kafka在進行持久化的時候,生成了兩個檔案,乙個是******x.log,乙個是******x.index,這其中log檔案中以鍊錶的形式儲存著訊息的詳細資訊,而index檔案中,則是儲存著這些訊息的索引,或者說偏移量,但又不是每一條訊息的索引都在index檔案中存在,而是稀疏的,比如log檔案中的訊息的索引從0-10000,那麼index檔案中儲存的索引可能是100, 500, 700, 1000, 5000, 6500,每乙個索引中都儲存著對應的log檔案中的訊息的具體位置,如圖:

下面用圖來演示一下在對快速鍊錶進行插入、刪除、查詢時,是如何定位到l0層中的具體位置的。

首先,假定有這麼乙個鍊錶,注意這裡只展示分數,而不展示具體的值了:

然後根據獲得的區間,去l1對應的區間中查詢,得到乙個更精確的區間:

上述即是對redis的跳躍表的原理的乙個簡述。

這種跳躍表的實現,其實和二分查詢的思路有點接近,只是一方面因為二分查詢只能適用於陣列,而無法適用於鍊錶,所以為了讓鍊錶有二分查詢類似的效率,就以空間換時間來達到目的。

跳躍表因為是乙個根據分數權重進行排序的列表,可以再很多場景中進行應用,比如排行榜,搜尋排序等等。

Redis基本資料結構之ZSet

zset保留了集合不能有重複成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作為排序依據不同的是,它給每個元素設定乙個分數 score 作為排序的依據。有序集合中的元素不能重複,但是score可以重複,就和乙個班裡的同學學號不能重複,但是考試成績可以相同。新增元素 命令為 ...

Redis基本資料結構之List

列表 list 型別是用來儲存多個有序的字串。在 redis 中,可以對列表的兩端進行插入 push 和彈出 pop 操作,還可以獲取指定範圍的元素列表 獲取指定索引下標的元素等。列表是一種比較靈活的資料結構,它可以充當棧和佇列的角色,在實際開發上有很多應用場景。如圖所示,a b c d e 五個元...

Redis五種基本資料型別及用法之Zset

zset可以理解為有序的set,根據給定的score排序。1.zadd 將指定的元素新增到有序集合中。2.zscore 返回 member 的 score 值。3.zrange 返回集合中的一組元素,這裡可以返回score指定範圍內的元素,當然也將score一起返回 withscores 4.zre...