天天看點

Redis指令詳解-sorted set相關指令目标BZPOPMINBZPOPMAXZPOPMAXZPOPMINZADDZREMZREMRANGEBYLEXZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBYZCARD keyZCOUNTZLEXCOUNTZRANGEZRANGEBYLEXZRANGEBYSCOREZREVRANGEZREVRANGEBYLEXZREVRANGEBYSCOREZRANKZREVRANKZSCOREZSCANZUNIONSTOREZINTERSTORE

目錄

目标

BZPOPMIN

BZPOPMAX

ZPOPMAX

ZPOPMIN

ZADD

ZREM

ZREMRANGEBYLEX

ZREMRANGEBYRANK

ZREMRANGEBYSCORE

ZINCRBY

ZCARD key

ZCOUNT

ZLEXCOUNT

ZRANGE

ZRANGEBYLEX

ZRANGEBYSCORE

    場景:根據元素權重随機擷取

ZREVRANGE

ZREVRANGEBYLEX

ZREVRANGEBYSCORE

ZRANK

ZREVRANK

ZSCORE

ZSCAN

ZUNIONSTORE

ZINTERSTORE

目标

列舉redis中與zset相關的指令,包括作用、使用時需要注意的地方等。對于某些基本用不到的指令僅一帶而過。

BZPOPMIN

    BZPOPMIN key [key ...] timeout

    O(log(N)) N:set中元素數量

    阻塞目前連接配接,從第一個有元素的sorted set中删除并取出score最小的元素

    當逾時時間到且沒有元素時,傳回null

    當有元素時,傳回由三個資料構成的數組,key、score、value

BZPOPMAX

ZPOPMAX

    ZPOPMAX key [count]

    O(log(N)*M) N:set中元素數量  M:傳回元素數量

    删除并傳回前count個score大的元素。不提供count,則傳回一個最大score的元素。多個count,則傳回count個元素。

    傳回score和元素

ZPOPMIN

ZADD

    ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

    O(log(N)) N:set中元素數量

    向sorted set中添加score和元素。如果元素存在,則重新設定score并重新插入到由score排序後的位置。如果key不存在,則建立sorted set。如果key對一個val不為sorted set,則error。

    score應可用兩位精度浮點數的string形式表示,+-都可以。

    options

        XX 僅更新已存在元素,忽略新增元素。

        NX 僅新增元素,忽略已存在元素。

        CH 改變傳回值,從預設傳回新增元素數量改為本次變更的元素數量,即新增+score更新的元素數量。

        INCR 行為與ZINCRBY一緻,隻操作一對score和val

    score範圍

        使用64bit的double表示score,可接受整數範圍+/-2^53.

    sorted set維持score正序,即從小到大。相同val不會重複存在,隻會更新score。

    具有相同score的元素,針對元素使用字典正序進行排序

ZREM

    ZREM key member [member ...]

    O(M*log(N)) N:set中元素數量,M:删除元素數量

    傳回已删除元素數量,元素不存在則忽略。

ZREMRANGEBYLEX

    ZREMRANGEBYLEX key minVal maxVal

    O(M*log(N)) N:set中元素數量,M:删除元素數量

    當所有元素的score相同時,強制針對val使用字典排序,删除val位于min max之間的元素。若score不相同,請不要使用。

    傳回本次删除的元素數量

    舉例

        redis> ZRANGE myzset 0 -1

1) "ALPHA"

 2) "aaaa"

 3) "alpha"

 4) "b"

 5) "c"

 6) "d"

 7) "e"

 8) "foo"

 9) "zap"

10) "zip"

redis> ZREMRANGEBYLEX myzset [alpha [omega

(integer) 6

redis> ZRANGE myzset 0 -1

1) "ALPHA"

2) "aaaa"

3) "zap"

4) "zip"

ZREMRANGEBYRANK

    ZREMRANGEBYRANK key startIndex stopIndex

    O(M*log(N)) N:set中元素數量,M:删除元素數量

    删除index位于start和stop的元素,0表示第一個元素,-1表示最後一個元素

    傳回本次删除元素數量

ZREMRANGEBYSCORE

    ZREMRANGEBYSCORE key minScore maxScore

    O(M*log(N)) N:set中元素數量,M:删除元素數量

    删除score位于min max間的元素

    傳回本次删除元素數量

ZINCRBY

    ZINCRBY key increment member

    O(log(N)) N:set中元素數量

    針對sorted set中元素member的score增加increment,其中increment允許為負值。如果元素不存在,則新增元素,使用increment作為score。如果key不存在,則建立key和sorted set并新增元素,使用increment作為score。如果key對應val不是soretd set,則error

    傳回member的score

ZCARD key

    傳回sorted set中元素數量

    O(1)

ZCOUNT

    ZCOUNT key minScore maxScore

    O(log(N)) N:set中元素數量

    score位于min max之間的元素數量

ZLEXCOUNT

    ZLEXCOUNT key minVal maxVal

    O(log(N)) N:set中元素數量

    當所有元素的score相同時,強制針對val使用字典排序,傳回val位于min max之間的數量。若score不相同,請不要使用。

ZRANGE

    ZRANGE key startIndex stopIndex [WITHSCORES]

    O(log(N)+M)  N:set中元素數量 M:傳回元素數量

    傳回索引位于[start,stop]的元素,預設score是從小到大排序,score相同時使用字典排序

    index說明

        index>0 0代表第一條 1代表第二條

        index<0 -1代表最後一條 -2倒數第二條

    WITHSCORES參數,傳回是否攜帶score

ZRANGEBYLEX

    ZRANGEBYLEX key minVal maxVal [LIMIT offset count]

    O(log(N)+M)  N:set中元素數量 M:傳回元素數量

    當所有元素的score相同時,強制針對val使用字典排序,傳回val位于min max之間的元素。若score不相同,請不要使用。

    limit僅針對符合min max範圍的元素,limit offset count,offset based-0,count為正,則從offset(含)起取count個元素count為負,則傳回從offset起所有符合條件的元素。

    範圍

        (或[表示不包含或包含,-或+表示特殊含義或無限小無限大

        ZRANGEBYLEX myzset - +,這對score都相同的set,表示取出所有元素

ZRANGEBYSCORE

    ZRANGEBYSCORE key minScore maxScore [WITHSCORES] [LIMIT offset count]

    O(log(N)+M)  N:set中元素數量 M:傳回元素數量

    元素按照score從小到大排序,傳回score在min max之間的元素。

    limit僅針對符合min max範圍的元素,limit offset count,offset based-0,count為正,則從offset(含)起取count個元素count為負,則傳回從offset起所有符合條件的元素。

    WITHSCORES參數,傳回之中是否攜帶score

    範圍

        min max可以為-inf +inf,表示在不知道最大最小score時擷取所有元素

        預設是包含,可使用(使用不包括

    場景:根據元素權重随機擷取

            A權重1,B權重2,C權重3,則權重和1+2+3=6

            根據權重設定元素score     

ELEMENTS = [A,B]
SUM = ELEMENTS.TOTAL_WEIGHT // 6 in this case.
SCORE = 0
FOREACH ELE in ELEMENTS
    SCORE += ELE.weight / SUM
    ZADD KEY SCORE ELE
END
ZADD KEY 1 C //避免不為整數1

zset内容:
A to score 0.16
B to score .5
C to score 1

// RAND() 傳回0-1間的随機數
RANDOM_ELE = ZRANGEBYSCORE key RAND() +inf LIMIT 0 1
           

ZREVRANGE

    ZREVRANGE key startIndex stopIndex [WITHSCORES]

    O(log(N)+M)  N:set中元素數量 M:傳回元素數量

    按照score倒序排序,檢視index位于start stop間的元素

ZREVRANGEBYLEX

    ZREVRANGEBYLEX key maxVal minVal [LIMIT offset count]

    O(log(N)+M)  N:set中元素數量 M:傳回元素數量

    當所有元素的score相同時,強制針對val使用字典倒序排序,傳回val位于max min之間的元素。若score不相同,請不要使用。

ZREVRANGEBYSCORE

    ZREVRANGEBYSCORE key maxScore minScore [WITHSCORES] [LIMIT offset count]

    O(log(N)+M)  N:set中元素數量 M:傳回元素數量

    score倒序排序,score位于max min間的元素

ZRANK

    ZRANK key member

     O(log(N))

    按照score正序排序,傳回元素的index(based-0),若key不存在或元素不存在則傳回null

ZREVRANK

    ZREVRANK key member

     O(log(N))

    score倒序排序,傳回元素的index(based-0)

ZSCORE

    ZSCORE key member

    O(1)

    傳回元素的score

ZSCAN

    ZSCAN key cursor [MATCH pattern] [COUNT count]

ZUNIONSTORE

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

    O(N)+O(M log(M)) N:set元素數量之和 M:并集中元素數量

    計算numkeys個sorted set的并集,并集中每個元素的score等于所在所有set中score之和,若設定權重,則先乘以權重後相加。

    WEIGHTS 

        可以為每個set提供一個權重,該set score*對應權重,預設為1

    AGGREGATE 

        規定并集中元素score的計算方式,SUM(預設求和) MIN(元素在多個set中,選元素對應score的最小值) MAX

ZINTERSTORE

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

    O(N*K)+O(M*log(M)) N:參數sets中具有最少元素set的元素數量 M:傳回值set的元素數量 K:參數sets的參數數量

    對numkeys數量的keys計算交集,存儲到dest。

    為什麼使用numkeys參數

        正确區分出keys和後續其他參數

    交集中元素的score

        無weight參數時,交集中元素score等于所在集合原始score的加和。