redis中Sorted-Sets類型的命令詳細介紹

redis中Sorted-Sets類型的命令詳細介紹

一、概述:

Sorted-Sets和Sets類型極為相似,它們都是字符串的集合,都不允許重復的成員出現在一個Set中。它們之間的主要差別是Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯,redis正是通過分數來為集合中的成員進行從小到大的排序。(推薦:redis視頻教程

然而需要額外指出的是,盡管Sorted-Sets中的成員必須是唯一的,但是分數(score)卻是可以重復的。

在Sorted-Set中添加、刪除或更新一個成員都是非常快速的操作,其時間復雜度為集合中成員數量的對數。由于Sorted-Sets中的成員在集合中的位置是有序的。

因此,即便是訪問位于集合中部的成員也仍然是非常高效的。事實上,Redis所具有的這一特征在很多其它類型的數據庫中是很難實現的,換句話說,在該點上要想達到和Redis同樣的高效,在其它數據庫中進行建模是非常困難的。

二、相關命令列表:

命令原型 時間復雜度 命令描述 返回值
ZADD key score member [score] [member]? O(log(N)) 時間復雜度中的N表示Sorted-Sets中成員的數量。添加參數中指定的所有成員及其分數到指定key的Sorted-Set中,在該命令中我們可以指定多組score/member作為參數。如果在添加時參數中的某一成員已經存在,該命令將更新此成員的分數為新值,同時再將該成員基于新值重新排序。如果鍵不存在,該命令將為該鍵創建一個新的Sorted-Sets Value,并將score/member對插入其中。如果該鍵已經存在,但是與其關聯的Value不是Sorted-Sets類型,相關的錯誤信息將被返回。 本次操作實際插入的成員數量。
ZCARD key? O(1) 獲取與該Key相關聯的Sorted-Sets中包含的成員數量。 返回Sorted-Sets中的成員數量,如果該Key不存在,返回0。
ZCOUNT key min max O(log(N)+M)? 時間復雜度中的N表示Sorted-Sets中成員的數量,M則表示min和max之間元素的數量。該命令用于獲取分數(score)在min和max之間的成員數量。針對min和max參數需要額外說明的是,-inf和+inf分別表示Sorted-Sets中分數的最高值和最低值。缺省情況下,min和max表示的范圍是閉區間范圍,即min 分數指定范圍內成員的數量。
ZINCRBY key increment member? O(log(N)) 時間復雜度中的N表示Sorted-Sets中成員的數量。該命令將為指定Key中的指定成員增加指定的分數。如果成員不存在,該命令將添加該成員并假設其初始分數為0,此后再將其分數加上increment。如果Key不存,該命令將創建該Key及其關聯的Sorted-Sets,并包含參數指定的成員,其分數為increment參數。如果與該Key關聯的不是Sorted-Sets類型,相關的錯誤信息將被返回。 以字符串形式表示的新分數。
ZRANGE key start stop [WITHSCORES]? O(log(N)+M) 時間復雜度中的N表示Sorted-Set中成員的數量,M則表示返回的成員數量。該命令返回順序在參數start和stop指定范圍內的成員,這里start和stop參數都是0-based,即0表示第一個成員,-1表示最后一個成員。如果start大于該Sorted-Set中的最大索引值,或start > stop,此時一個空集合將被返回。如果stop大于最大索引值,該命令將返回從start到集合的最后一個成員。如果命令中帶有可選參數WITHSCORES選項,該命令在返回的結果中將包含每個成員的分數值,如value1,score1,value2,score2…。   返回索引在start和stop之間的成員列表。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]? O(log(N)+M) 時間復雜度中的N表示Sorted-Set中成員的數量,M則表示返回的成員數量。該命令將返回分數在min和max之間的所有成員,即滿足表達式min 返回分數在指定范圍內的成員列表。
ZRANK key member? O(log(N)) ? ? ? ?? 時間復雜度中的N表示Sorted-Set中成員的數量。Sorted-Set中的成員都是按照分數從低到高的順序存儲,該命令將返回參數中指定成員的位置值,其中0表示第一個成員,它是Sorted-Set中分數最低的成員。 如果該成員存在,則返回它的位置索引值。否則返回nil。
ZREM key member [member …] O(M log(N)) 時間復雜度中N表示Sorted-Set中成員的數量,M則表示被刪除的成員數量。該命令將移除參數中指定的成員,其中不存在的成員將被忽略。如果與該Key關聯的Value不是Sorted-Set,相應的錯誤信息將被返回。 實際被刪除的成員數量。
ZREVRANGE key start stop [WITHSCORES] ? O(log(N)+M)? 時間復雜度中的N表示Sorted-Set中成員的數量,M則表示返回的成員數量。該命令的功能和ZRANGE基本相同,唯一的差別在于該命令是通過反向排序獲取指定位置的成員,即從高到低的順序。如果成員具有相同的分數,則按降序字典順序排序。 返回指定的成員列表。
ZREVRANK key member? O(log(N)) 時間復雜度中的N表示Sorted-Set中成員的數量。該命令的功能和ZRANK基本相同,唯一的差別在于該命令獲取的索引是從高到低排序后的位置,同樣0表示第一個元素,即分數最高的成員。 如果該成員存在,則返回它的位置索引值。否則返回nil。?
ZSCORE key member O(1) ? ? ? ? 獲取指定Key的指定成員的分數。 如果該成員存在,以字符串的形式返回其分數,否則返回nil。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]? O(log(N)+M)? 時間復雜度中的N表示Sorted-Set中成員的數量,M則表示返回的成員數量。該命令除了排序方式是基于從高到低的分數排序之外,其它功能和參數含義均與ZRANGEBYSCORE相同。 返回分數在指定范圍內的成員列表。?
ZREMRANGEBYRANK key start stop? O(log(N)+M) 時間復雜度中的N表示Sorted-Set中成員的數量,M則表示被刪除的成員數量。刪除索引位置位于start和stop之間的成員,start和stop都是0-based,即0表示分數最低的成員,-1表示最后一個成員,即分數最高的成員。 ? 被刪除的成員數量。
ZREMRANGEBYSCORE key min max? O(log(N)+M) 時間復雜度中的N表示Sorted-Set中成員的數量,M則表示被刪除的成員數量。刪除分數在min和max之間的所有成員,即滿足表達式min 被刪除的成員數量。

三、命令示例:

1、 ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:

????#在Shell的命令行下啟動Redis客戶端工具。 ????/>?redis-cli ????#添加一個分數為1的成員。 ????redis?127.0.0.1:6379>?zadd?myzset?1?"one" ????(integer)?1 ????#添加兩個分數分別是2和3的兩個成員。 ????redis?127.0.0.1:6379>?zadd?myzset?2?"two"?3?"three" ????(integer)?2 ????#0表示第一個成員,-1表示最后一個成員。WITHSCORES選項表示返回的結果中包含每個成員及其分數,否則只返回成員。 ????redis?127.0.0.1:6379>?zrange?myzset?0?-1?WITHSCORES ????1)?"one" ????2)?"1" ????3)?"two" ????4)?"2" ????5)?"three" ????6)?"3" ????#獲取成員one在Sorted-Set中的位置索引值。0表示第一個位置。 ????redis?127.0.0.1:6379>?zrank?myzset?one ????(integer)?0 ????#成員four并不存在,因此返回nil。 ????redis?127.0.0.1:6379>?zrank?myzset?four ????(nil) ????#獲取myzset鍵中成員的數量。???? ????redis?127.0.0.1:6379>?zcard?myzset ????(integer)?3 ????#返回與myzset關聯的Sorted-Set中,分數滿足表達式1??zcount?myzset?1?2 ????(integer)?2 ????#刪除成員one和two,返回實際刪除成員的數量。 ????redis?127.0.0.1:6379>?zrem?myzset?one?two ????(integer)?2 ????#查看是否刪除成功。 ????redis?127.0.0.1:6379>?zcard?myzset ????(integer)?1 ????#獲取成員three的分數。返回值是字符串形式。 ????redis?127.0.0.1:6379>?zscore?myzset?three ????"3" ????#由于成員two已經被刪除,所以該命令返回nil。 ????redis?127.0.0.1:6379>?zscore?myzset?two ????(nil) ????#將成員one的分數增加2,并返回該成員更新后的分數。 ????redis?127.0.0.1:6379>?zincrby?myzset?2?one ????"3" ????#將成員one的分數增加-1,并返回該成員更新后的分數。 ????redis?127.0.0.1:6379>?zincrby?myzset?-1?one ????"2" ????#查看在更新了成員的分數后是否正確。 ????redis?127.0.0.1:6379>?zrange?myzset?0?-1?WITHSCORES ????1)?"one" ????2)?"2" ????3)?"two" ????4)?"2" ????5)?"three" ????6)?"3"

2、ZRANGEBYSCORE/ZREMRANGEBYRANK/ZREMRANGEBYSCORE

????redis?127.0.0.1:6379>?del?myzset ????(integer)?1 ????redis?127.0.0.1:6379>?zadd?myzset?1?one?2?two?3?three?4?four ????(integer)?4 ????#獲取分數滿足表達式1??zrangebyscore?myzset?1?2 ????1)?"one" ????2)?"two" ????#獲取分數滿足表達式1??zrangebyscore?myzset?(1?2 ????1)?"two" ????#-inf表示第一個成員,+inf表示最后一個成員,limit后面的參數用于限制返回成員的自己, ????#2表示從位置索引(0-based)等于2的成員開始,去后面3個成員。 ????redis?127.0.0.1:6379>?zrangebyscore?myzset?-inf?+inf?limit?2?3 ????1)?"three" ????2)?"four" ????#刪除分數滿足表達式1??zremrangebyscore?myzset?1?2 ????(integer)?2 ????#看出一下上面的刪除是否成功。 ????redis?127.0.0.1:6379>?zrange?myzset?0?-1 ????1)?"three" ????2)?"four" ????#刪除位置索引滿足表達式0??zremrangebyrank?myzset?0?1 ????(integer)?2 ????#查看上一條命令是否刪除成功。 ????redis?127.0.0.1:6379>?zcard?myzset ????(integer)?0

3、 ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK:

????#為后面的示例準備測試數據。 ????redis?127.0.0.1:6379>?del?myzset ????(integer)?0 ????redis?127.0.0.1:6379>?zadd?myzset?1?one?2?two?3?three?4?four ????(integer)?4 ????#以位置索引從高到低的方式獲取并返回此區間內的成員。 ????redis?127.0.0.1:6379>?zrevrange?myzset?0?-1?WITHSCORES ????1)?"four" ????2)?"4" ????3)?"three" ????4)?"3" ????5)?"two" ????6)?"2" ????7)?"one" ????8)?"1" ????#由于是從高到低的排序,所以位置等于0的是four,1是three,并以此類推。 ????redis?127.0.0.1:6379>?zrevrange?myzset?1?3 ????1)?"three" ????2)?"two" ????3)?"one" ????#由于是從高到低的排序,所以one的位置是3。 ????redis?127.0.0.1:6379>?zrevrank?myzset?one ????(integer)?3 ????#由于是從高到低的排序,所以four的位置是0。 ????redis?127.0.0.1:6379>?zrevrank?myzset?four ????(integer)?0 ????#獲取分數滿足表達式3?>=?score?>=?0的成員,并以相反的順序輸出,即從高到底的順序。 ????redis?127.0.0.1:6379>?zrevrangebyscore?myzset?3?0 ????1)?"three" ????2)?"two" ????3)?"one" ????#該命令支持limit選項,其含義等同于zrangebyscore中的該選項,只是在計算位置時按照相反的順序計算和獲取。 ????redis?127.0.0.1:6379>?zrevrangebyscore?myzset?4?0?limit?1?2 ????1)?"three" ????2)?"two"

四、應用范圍:

1)、可以用于一個大型在線游戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD命令更新玩家的分數,此后再通過ZRANGE命令獲取積分TOP TEN的用戶信息。

當然我們也可以利用ZRANK命令通過username來獲取玩家的排行信息。最后我們將組合使用ZRANGE和ZRANK命令快速的獲取和某個玩家積分相近的其他用戶的信息。

更多redis知識請關注redis視頻教程欄目。

2)、Sorted-Sets類型還可用于構建索引數據。

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享