<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
ZSet能用在哪些場景?跳錶查詢的過程,時間複雜度
舉個例子,fruit-price 是一個有序集合鍵,這個有序集合以水果名為成員,水果價錢為分值,儲存了 130 款水果的價錢:
redis>ZADD fruit-price 5 "banana" redis>ZADD fruit-price 6.5 "cherry" redis>ZADD fruit-price 8 "apple" redis> ZRANGE fruit-price 0 2 WITHSCORES 1) "banana" 2) "5" 3) "cherry" 4) 6.5 5) "apple" 6) "8" redis> ZCARD fruit-price (integer)130
ZSet 結構即支援單個元素查詢,又支援範圍查詢,是如何實現的呢?
Redis 中有兩種資料結構來支援 ZSet 的功能,一個是字典 dict ,一個是 zskipList; 字典儲存著從 member 到 score 的對映,跳躍表按 score 從小到大儲存所有集合元素
先看下 ZSet 在程式碼中的定義:
typedef struct zset { dict *dict; zskiplist *zsl; } zset;
dict 各種程式語言中都有實現。可以保證 O(1) 的時間複雜度; 我們繼續看 zskiplist 的定義:
typedef struct zskiplist { struct zskiplistNode *header, *tail; unsigned long length; int level; } zskiplist;
zskiplist 是 Redis 對 skiplist 做了變種,skiplist 就是我們常說的跳錶;
跳躍表的特點
查詢過程
舉例說明
假設連結包含 1-10,共 10 個元素。我們要找到第 9 個,需要從 header 遍歷,共 9 次才能找到:
一次只能比較一個數,最壞的情況下時間複雜度是 O(n),如果我們一次可以比較 2 個元素就好了:
一次查詢 2 個的話,我們只找了 5 次就找到了。所以就有了類似下面的結構,在連結串列上增加一層減少了元素個數的 “連結串列”:
如果增加兩層 “連結串列”,只查詢 3 次就可以找到:
即便是我們找元素 8,也只需要遍歷 1 -> 4 -> 7 -> 8,共 4 次查詢;
這樣查詢過程就非常類似於一個二分查詢,使得查詢的時間複雜度可以降低到 O(log n)
ZskipList 插入過程:
從上面 Skiplist 的建立和插入過程可以看出,每一個節點的層數(level)是隨機出來的,而且新插入一個節點不會影響其它節點的層數。 因此,插入操作只需要修改插入節點前後的指標,而不需要對很多節點都進行調整。這就降低了插入操作的複雜度
Redis 初始化的時候,只判斷儲存的元素長度是否大於 64 個位元組。大於 64 個位元組選擇 Zkiplist,否則 Ziplist。當執行增刪改查的方法,根據是 ziplist 還是 zkiplist 選擇不同的實現。只需要記住 zset,在兩種情況下使用 ziplist:
儲存的元素個數不足 128 個;單個元素的大小超過 64 byte;
ziplist 編碼的有序集合使用緊挨在一起的壓縮列表節點來儲存,第一個節點儲存 member,第二個儲存 score。ziplist 內的集合元素按 score 從小到大排序,score 較小的排在表頭位置
為什麼採用跳躍表
1、資訊統計
假設我們有某個班級所有學生的語文成績,想統計、查詢區間範圍、查詢單個學生成績、滿足高效能讀取這些需求, Redis 的 zset 結構無疑是最好的選擇。Redis 提供了豐富的 API。範例
ZADD yuwen 90 s01 89 s03 99 s02 74 s04 97 s05
以 yuwen 為 key 分別儲存了 s01 到 s06 共計 6 名學生的分數,我們可以查詢任一學生的成績:
ZSCORE yuwen s03
可以按照排序返回指定區間內的所有元素
ZRANGE yuwen 1 2 withscores
可以存取指定分數區間內的所有元素
ZRANGEBYSCORE yuwen 90 100 withscores
可以統計指定區間內的個數
ZCOUNT yuwen 80 90
2、排行榜
到此這篇關於Redis中ZSet的具體使用的文章就介紹到這了,更多相關Redis ZSet使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45