當前位置:編程學習大全網 - 源碼下載 - 關於redis中的zset(sorted set)

關於redis中的zset(sorted set)

zset相關的問題,算是面試中的高頻問題了。那麽zset到底是什麽?底層的實現原理是什麽?相關的使用場景有哪些?

1. zset是什麽?

在redis官網( /commands.html#sorted_set )看到,有興趣的同學可以直接去看。

ZADD key score1 value1 score2 value2........

即表示增加是的score和value 組,可同時增加多個

?4. zset實現

在redis.conf中,有如下兩個參數:

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

這兩個條件均不滿足,使用ziplist壓縮表來實現sorted set

滿足這兩個條件之壹,sorted set的內部實現會由ziplist轉換為zset

zset-max-ziplist-entries 128,即sorted set中的元素對超過128時(存儲的是score和value的元素對,所以數據項是256),內部實現會由ziplist轉換為zset。

zset-max-ziplist-value 64,即任意壹個value的長度超過了64字節,內部實現會由ziplist轉換為zset.

zset由dict、skiplist實現。

5.?ziplist,即壓縮列表

壓縮列表是由連續性內存組成的順序性數據結構,壹個壓縮列表可以包含任意多的entry,每個entry可以保存壹個字節數組或者壹個整數。

壓縮列表在表頭有三個字段:zlbytes,zltail,zllen分別表示列表長度(整個列表占用的字節數),列表尾的偏移量(尾節點距離起始地址的字節數)和列表中entry的個數。

列表表尾還有壹個zlend,表示列表結束了。

6.skiplist

由上圖壓縮列表可知,如果我們查找第壹個元素或者最後壹個元素,直接通過表頭三個字段的長度可定位。復雜度是O(1),而如果查找其他元素,只能順序查找,復雜度是O(n)。 為了解決這個問題,可以使用跳表。

在新增節點之前,也會先經過查詢,確定插入位置,再完成插入操作,同時也實現了Sorted Set的排序。

跳表中新增加節點不會影響其他節點的索引位置。因此插入操作只需要修改插入節點前後的指針,不需要修改所有節點,降低了插入的復雜度,所以跳表在插入性能上明顯優於平衡樹。

?7. zset的使用場景

需要排序的場景,比如top10的熱點文章,或者排行榜

消息的延遲發送,用score存儲發送時間戳,定時任務掃描sorted set,判斷時間進行發送。

  • 上一篇:電腦裏軟件的卸載殘留,怎麽都刪不了,
  • 下一篇:怎樣把網站放到搜索的前面?
  • copyright 2024編程學習大全網