無序集合
集合數據類型與列表數據類型相似,它們都可以存儲多個元素;集合數據類型具備的特性是,根據兩個集合求左差、右差、相交和去重合并;下面列出集合類型和列表類型的區別。
| 集合類型 | 列表類型
--- |--- | ---
存儲內容(長度) | 4, 294, 967, 295 | 4, 294, 967, 295
有序性 | 無序 | 有序
唯一性 | 是 | 否
有序集合
在集合類型的基礎上為每個元素增加了一個分數,針對該分數擴展提供了分片功能,比如說可以獲取分數最高(或最低)的前N個元素、獲取制定分數范圍內的元素等操作(雖然集合中每個元素都是不同的,但是它們的分數卻可以相同)。
公共代碼片段
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)
# 準備數據
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)
元素分片
# 打印所有數據
print(r.zrange('scoreboard', 0, -1, withscores=True))
# 顯示結果
[('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)]
備注:有序集合默認獲取的數據就是按照score分數來排列順序的。
分數分片
# 查看數據
print(r.zrangebyscore('scoreboard', 50, 90, withscores=True))
# 顯示結果
[('Jerry', 56.0), ('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0)]
分數中的條件
# 篩選分數大于60分的人
print(r.zrangebyscore('scoreboard', 60, '+inf', withscores=True))
# 顯示結果
[('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0), ('Adam', 80.0), ('Tom', 89.0), ('Wendy', 92.0), ('Michael', 97.0), ('David', 100.0)]
# 篩選分數大于60分且分數最低的三個人
print(r.zrangebyscore('scoreboard', 60, '+inf', start=0, num=3, withscores=True))
# 顯示結果
[('Peter', 67.0), ('Yvonne', 67.0), ('Jack', 77.0)]
# 篩選分數大于60分且分數最高的三個人
print(r.zrevrangebyscore('scoreboard', '+inf', 60, start=0, num=3, withscores=True))
# 顯示結果
[('David', 100.0), ('Michael', 97.0), ('Wendy', 92.0)]
獲取元素排名
# 打印所有數據
print(r.zrange('scoreboard', 0, -1, withscores=True))
# 查看結果
[('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元素的排名,它會根據當前元素的分數進行排列并計算出Tom的排名。
print(r.zrank('scoreboard', 'Tom'))
# 查看結果
8
有序集合的交集
# 準備第二組數據, 其中Jack在兩組數據中都是存在的.
r.zadd('scoreboard_2',
Daniel=10, Alex=20, Jack=6)
# 提取交集,zinterstore默認會將兩組數據中相同的名字的分數進行相加.
# 有序集合在這里會將提取出來的結果存放到一個獨立的鍵值對象中(在這里是scoreboard_result).
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'))
# 打印結果
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結果
[('Jack', 83.0)]
# zinterstore的可選參數:aggregate
# 它有三個固定參數:sum, max, min
# sum是默認參數,表示相同名字的分數相加
# max表示相同名字的分數取最大的那個
# min表示相同名字的分數取最小的那個
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'), aggregate='min')
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結果
[('Jack', 6.0)]
r.zinterstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'), aggregate='max')
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結果
[('Jack', 77.0)]
有序集合的去重合并
# 準備第二組數據, 其中Jack在兩組數據中都是存在的.
r.zadd('scoreboard_2',
Daniel=10, Alex=20, Jack=6)
# 去重合并,分數相加(默認情況下aggregate等于sum)
r.zunionstore('scoreboard_result', keys=('scoreboard', 'scoreboard_2'))
print(r.zrange('scoreboard_result', 0, -1, withscores=True))
# 顯示結果
[('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 |
?
?
參考
- [x] 書籍: Redis 入門指南