Redis學習-SortedSet


  Sorted-Sets和Sets類型極為相似,它們都是字符串的集合,都不允許重復的成員出現在一個Set中。它們之間的主要差別是Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來為集合中的成員進行的排序。盡管Sorted-Sets中的成員必須是唯一的,但是分數(score)卻是可以重復的。在Sorted-Set中添加、刪除或更新一個成員都是非常快速的操作,其時間復雜度為集合中成員數量的對數。由於Sorted-Sets中的成員在集合中的位置是有序的,因此,即便是訪問位於集合中部的成員也仍然是非常高效的。

常用命令

命令

時間復雜度

描述

返回值

ZADD key score member

[[score member] ...]

O(M*log(N)),N 是基數,M為新成員的數量。

將一個或多個member元素及其score值加入到有序集key當中.如果member已經是有序集的成員,那么更新這個member的 score值,並通過重新插入這個member元素,來保證該member 在正確的位置上.score值可以是整數值或雙精度浮點數.如果 key不存在,則創建一個空的有序集並執行ZADD操作.當key存在但不是有序集類型時,返回一個錯誤.

被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。

ZCARD

O(1)

當key存在且是有序集類型時,返回有序集的基數.當key不存在時,返回0 。

 

ZCOUNT key min max

O(log(N)),N為有序集的基數。

返回有序集key中,score值在min和max之間(默認包括 score 值等於min或max )的成員的數量。

 

ZINCRBY key increment member

O(log(N))

為有序集key的成員member的score值加上增量increment.可以通過傳遞一個負數值increment ,讓score減去相應的值,比如 ZINCRBY key -5 member.當key不存在,或membe不是key的成員時,INCRBY key increment member等同於 ZADD key increment member.當key不是有序集類型時,返回一個錯誤.

member 成員的新score 值,以字符串形式表示.

ZRANGE key start stop [WITHSCORES]

O(log(N)+M),為有序集的基數,M為結果集的基數。

返回有序集key中,指定區間內的成員(按score值遞增排序).相同score值的成員按字典序來排列.如果需要按score值遞減來排列,使用 ZREVRANGE 命令.下標參數start和stop都以0為底.可以使用負數下標,-1表示最后一個成員,-2表示倒數第二個成員.超出范圍的下標並不會引起錯誤。比如說,當start的值比有序集的最大下標還要大,或是start > stop時,ZRANGE命令只是簡單地返回一個空列表;假如stop參數的值比有序集的最大下標還要大,將stop當作最大下標來處理。WITHSCORES選項讓成員和它的 score值一並返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

指定區間內,帶有 score 值(可選)的有序集成員的列表。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

O(log(N)+M),N 為有序集的基數,M 為被結果集的基數。

返回有序集key中,所有score值介min和max之間(包括等於 mi或max )的成員。有序集成員按score值遞增次序排列,具有相同 score 值的成員按字典序來排列.可選的 LIMIT 參數指定返回結果的數量及區間.注意當offset很大時,定位offset的操作可能需要遍歷整個有序集,此過程最壞復雜度O(N)時間。min和max可以是-inf和+inf .默認情況下,區間的取值使用閉區間 (小於等於或大於等於),你也可以通過給參數前增加 ( 符號來使用可選的開區間 (小於或大於)。

指定區間內,帶有 score 值(可選)的有序集成員的列表。

ZRANK key member

O(log(N))

返回有序集key中成員member的排名.其中有序集成員按score值遞增順序排列.排名以0為底。使用 ZREVRANK 命令可以獲得成員按score值遞減排列的排名。

member是有序集 key的成員,返回的排名.如果不是返回 nil 。

ZREM key [member ...]

O(M*log(N)),N為基數,M為被成功數量。

移除有序集key中的一個或多個成員,不存在的成員將被忽略。當key存在但不是有序集類型時,返回一個錯誤。

被成功移除的成員的數量,不包括被忽略的成員。

ZREMRANGEBYRANK key start stop

O(log(N)+M),N 為基數,而M 為被移除數量。

移除有序集key中,指定排名(rank)區間內的所有成員.

區間分別以下標參數start和stop指出,包含start和 stop在內。可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員。

被移除成員的數量。

ZREMRANGEBYSCORE key min max

O(log(N)+M),N為數,而M為被移除數量。

移除有序集key中,所有score值介於min和max之間(包括等於min或max )的成員。

被移除成員的數量。

ZSCORE key member

O(1)

返回有序集key中,成員member的score值。如果 member不存在,或key不存在,返回nil 。

成員的score 值

UNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

O(N)+O(M log(M)), N 為給定有序集基數的總和, M 為結果集的基數。

計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 參數指定,並將該並集(結果集)儲存到 destination 。默認情況下,結果集中某個成員的 score值是所有給定集下該成員 score值之和。使用 WEIGHTS 選項,可以為每個給定有序集分別指定一個乘法因子(multiplication factor),每個給定有序集的所有成員的 score 值在傳遞給聚合函數(aggregation function)之前都要先乘以該有序集的因子。乘法因子默認設置為 1 。使用 AGGREGATE 選項,你可以指定並集的結果集的聚合方式。默認使用的參數SUM ,可以將score 值之和作為結果集中該成員的score值;使用參數MIN,將最小score值作為結果集中該成員的score值;而參數MAX則是將最大score值作為結果集中該成員的 score 值。

保存到 destination 的結果集的基數。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

 

計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 參數指定,並將該交集(結果集)儲存到 destination 。默認情況下,結果集中某個成員的 score 值是所有給定集下該成員 score 值之和.

保存到 destination 的結果集的基數。

ZLEXCOUNT key min max

O(log(N)),N為有序集合包含的元素數量。

對於一個所有成員的分值都相同的有序集合鍵key來說,這個命令會返回該集合中,成員介於min和max范圍內的元素數量。

 

ZREMRANGEBYLEX key min max

 

對於一個所有成員的分值都相同的有序集合鍵 key 來說, 這個命令會移除該集合中, 成員介於 min 和 max 范圍內的所有元素。

 

ZRANGEBYLEX key min max [LIMIT offset count]

 

當有序集合的所有成員都具有相同的分值時,有序集合的元素會根據成員的字典序來進行排序,而這個命令則可以返回給定的有序集合鍵 key中,值介於min和max 之間的成員.如果有序集合里面的成員帶有不同的分值, 那么命令返回的結果是未指定的(unspecified)。命令會使用 C 語言的 memcmp() 函數,對集合中的每個成員進行逐個字節的對比(byte-by-byte compare), 並按照從低到高的順序, 返回排序后的集合成員。 如果兩個字符串有一部分內容是相同的話, 那么命令會認為較長的字符串比較短的字符串要大。

 


應用范圍

  • 可以用於一個大型在線游戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD命令更新玩家的分數,此后再通過ZRANGE命令獲取積分TOP TEN的用戶信息。當然我們也可以利用ZRANK命令通過username來獲取玩家的排行信息。最后我們將組合使用ZRANGE和ZRANK命令快速的獲取和某個玩家積分相近的其他用戶的信息。
  • Sorted-Sets類型還可用於構建索引數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM