標籤:redis 有序集合 sorted set 辛星
Redis中的有序集合也就是sorted-set,它和set很相似,都是字串的集合,都不允許重複的成員出現在一個集合張。有序集合與集合的主要差別是有序集合中的每一個元素都有一個序號與其相連,這個序號即score,Redis通過這個序號來為集合中的成員進行從小到大的排列。需要特別說明的是,儘管有序集合的元素值是唯一的,但是該value對應的score卻可以是多個。在有序集合中添加、刪除、更新一個成員的操作都很快,其時間複雜度是集合中成員的對數。 因為有序集合中的成員在集合中的位置是有序的,即便是訪問集合中間部分的成員的效率也很高。
我們可以使用有序集合來設計一個類似於積分熱門排行榜的東西,那麼每當使用者的積分發生變化時,可以實行zadd命令來更新使用者的積分,然後通過zrange來擷取積分前若干的使用者資訊。當然也可以利用zrank命令來通過username來擷取使用者的排行資訊。
下面是有序集合的常見命令:
(1)zadd 集合名 下標1 元素1 [下標2 元素2.....] 它是向有序集合中添加元素,在該命令中我們可以指定多組的下標元素對。如果在添加時參數中的某一成員已經存在,那麼該命令將會更新此成員的分數為新值,同時再將該成員基於該新值重新排序。如果集合名不存在,該命令會建立一個新的有序集合,並且將下標元素對插入其中。如果集合名已存在,但是其作為key與之關聯的value並不是有序集合,那麼將會返回錯誤資訊。該操作的返回值是實際插入的成員數量。
(2)zcard 集合名 該命令會擷取有序集合中的成員數量。返回值是有序集合中的成員數量,如果該有序集合不存在,那麼返回0.
(3)zcount 集合名 最小下標 最大下標 其中我們可以使用+inf或者-inf,其中+inf表示有序集合中下標的最大值,而-inf則表示有序集合中的最小值。在預設情況下,最小下標和最大下標都是閉區間的,但是我們可以在最小下標或者最大下標中添加一個"("來表示開區間。它返回的是指定下標範圍內的元素的數量。
(4)zincrby 集合名 增量 元素名 它可以為指定的有序集合張的指定成員的下標增加一個增量,如果成員不存在,該命令添加該成員並且假設其初始下標為0,伺候在將其下標加上增量。如果集合名不存在,那麼該命令將會自動建立該集合,並且添加相應的鍵值對。它返回的是以字串形式表示的新下標。
(5)zrange 集合名 起始下標 結束下標 [withscores] 它會返回下標在起始下標與結束下標之間的成員,注意這裡的下標是從0開始的,而-1則表示最後一個成員。我們的選擇性參數withscores表示同時返回每個成員的下標。它表示返回索引在起始下標與結束下標之間的成員列表。
(6)zrangebyscore 集合名 最小下標 最大下標 [withscores ][limit offset count] 該命令返回下標在最小下標到最大下表中中的所有成員,它返回的成員按照分數從低到高的順序返回,如果成員有相同的分數,則按成員的字典順序返回。可選的limit用於控制返回成員的數量範圍。可選的參數offset表示從合格第offset個成員開始返回,同時返回count個成員。
(7)zrank 集合名 元素名 它是該集合中的成員按照下標從低到高的順序儲存,該命令將返回參數中指定成員的位置值,其中0表示參數中指定成員的位置值。
(8)zrem 集合名 元素1 元素2 ..... 該命令移除參數中指定的成員,如果不存在則會被忽略。它返回的是實際被刪除的成員數量。
(9)zrevrange 集合名 起始下標 結束下標 [withscores] 它與zrange基本相同,唯一的差別在於該命令通過反向排序擷取指定位置的成員,也就是從高到低的順序。
(10)zrevrank 集合名 元素 它擷取排名的時候是從高到低的順序來編號的,注意下標最大的順序為0奧
(11)zscore 集合名 元素 它擷取指定集合名中的指定成員的下標
(12)zrevrangebyscore 集合名 最大下標 最小下標 [withscores][limit offset count] 該命令除了排序方式是基於從高到低的下標排序之外,其他的和zrangebyscore相同。
(13)zremrangebyrank 集合名 起始下標 結束下標 它是刪除索引位置位於起始下標和結束下標之間的成員,注意起始下標和結束下標都是0-based,也就是0表示分數最低的成員,而-1表示最後一個成員,即分數最高的成員。
(14)zremrangebyscore 集合名 最小下標 最大下標 它是刪除分數在最小下標和最大下標之間的所有成員,對於最小下標和最大下標,也可以採用開區間的形式。
基本我們就介紹到這裡啦,希望有用。
辛星淺析Redis中的有序集合