redis05集合

無序集合

集合數(shù)據(jù)類型與列表數(shù)據(jù)類型相似,它們都可以存儲多個元素;集合數(shù)據(jù)類型具備的特性是,根據(jù)兩個集合求左差、右差、相交和去重合并;下面列出集合類型和列表類型的區(qū)別。

  •         | 集合類型         | 列表類型
    

--- |--- | ---
存儲內(nèi)容(長度) | 4, 294, 967, 295 | 4, 294, 967, 295
有序性 | 無序 | 有序
唯一性 | 是 | 否

有序集合

在集合類型的基礎上為每個元素增加了一個分數(shù),針對該分數(shù)擴展提供了分片功能,比如說可以獲取分數(shù)最高(或最低)的前N個元素、獲取制定分數(shù)范圍內(nèi)的元素等操作(雖然集合中每個元素都是不同的,但是它們的分數(shù)卻可以相同)。

公共代碼片段

import redis
from _functools import partial

# 連接redis
r = redis.StrictRedis('192.168.1.124', decode_responses=True)

# 清空所有鍵
for number, key in enumerate(r.keys()):
    r.delete(key)

# 準備數(shù)據(jù)
r.zadd('scoreboard',
       Tom=89, Peter=67, David=100,
       Jerry=56, Wendy=92, Yvonne=67,
       Anna=32, Eric=47, Jack=77,
       Adam=80, Michael=97, William=49)

元素分片

# 打印所有數(shù)據(jù)
print(r.zrange('scoreboard', 0, -1, withscores=True))
# 顯示結(jié)果
[('Anna', 32.0), ('Eric', 47.0), ('William', 49.0), ('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]

備注:有序集合默認獲取的數(shù)據(jù)就是按照score分數(shù)來排列順序的。

分數(shù)分片

# 查看數(shù)據(jù)
print(r.zrangebyscore('scoreboard', 50, 90, withscores=True))

# 顯示結(jié)果
[('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0)]

分數(shù)中的條件

# 篩選分數(shù)大于60分的人
print(r.zrangebyscore('scoreboard', 60, '+inf', withscores=True))
# 顯示結(jié)果
[('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]

# 篩選分數(shù)大于60分且分數(shù)最低的三個人
print(r.zrangebyscore('scoreboard', 60, '+inf', start=0, num=3, withscores=True))
# 顯示結(jié)果
[('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0)]

# 篩選分數(shù)大于60分且分數(shù)最高的三個人
print(r.zrevrangebyscore('scoreboard', '+inf', 60, start=0, num=3, withscores=True))
# 顯示結(jié)果
[('David', 100.0), ('Michael', 97.0), ('Wendy', 92.0)]

獲取元素排名

# 打印所有數(shù)據(jù)
print(r.zrange('scoreboard', 0, -1, withscores=True))
# 查看結(jié)果
[('Anna', 32.0), ('Eric', 47.0), ('William', 49.0), ('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]


# 打印Tom元素的排名,它會根據(jù)當前元素的分數(shù)進行排列并計算出Tom的排名。
print(r.zrank('scoreboard', 'Tom'))
# 查看結(jié)果
8

有序集合的交集

# 準備第二組數(shù)據(jù), 其中Jack在兩組數(shù)據(jù)中都是存在的.
r.zadd('scoreboard_2',
       Daniel=10, Alex=20, Jack=6)

# 提取交集,zinterstore默認會將兩組數(shù)據(jù)中相同的名字的分數(shù)進行相加.
# 有序集合在這里會將提取出來的結(jié)果存放到一個獨立的鍵值對象中(在這里是scoreboard_result).
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'))

# 打印結(jié)果
print(r.zrange('scoreboard_result', 0, -1, withscores=True))

# 顯示結(jié)果
[('Jack', 83.0)]


# zinterstore的可選參數(shù):aggregate
# 它有三個固定參數(shù):sum, max, min
# sum是默認參數(shù),表示相同名字的分數(shù)相加
# max表示相同名字的分數(shù)取最大的那個
# min表示相同名字的分數(shù)取最小的那個
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'), aggregate='min')
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結(jié)果
[('Jack', 6.0)]


r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'), aggregate='max')
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結(jié)果
[('Jack', 77.0)]

有序集合的去重合并

# 準備第二組數(shù)據(jù), 其中Jack在兩組數(shù)據(jù)中都是存在的.
r.zadd('scoreboard_2',
       Daniel=10, Alex=20, Jack=6)

# 去重合并,分數(shù)相加(默認情況下aggregate等于sum)
r.zunionstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'))
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結(jié)果
[('Daniel', 10.0), ('Alex', 20.0), ('Anna', 32.0), ('Eric', 47.0), ('William', 49.0), ('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Adam', 80.0), ('Jack', 83.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]

?
?

Sets / 集合類型命令(14)
  •       |-          | -        | -           | - 
    

--- |--- | --- | --- | ---
SADD | SCARD | SDIFF | SDIFFSTORE | SINTER
SINTERSTORE | SISMEMBER | SMEMBERS | SMOVE | SPOP
SRANDMEMBER | SREMSSCAN | SUNION | SUNIONSTORE |

?

Sorted Sets / 有序集合類型命令(21)
  •           |-                 | -      | -        
    

--- |--- | --- | ---
ZADD | ZCARD | ZCOUNT | ZINCRBY
ZINTERSTORE | ZLEXCOUNT | ZRANGE | ZRANGEBYLEX
ZRANGEBYSCORE | ZRANK | ZREM | ZREMRANGEBYLEX
ZREMRANGEBYRANK | ZREMRANGEBYSCORE | ZSCAN | ZREVRANGEBYLEX
ZREVRANGE | ZREVRANGEBYSCORE | ZSCORE | ZREVRANK
ZUNIONSTORE |

?
?

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容