摘要:對給定的有序集合執(zhí)行類似于集合的并集運算。用戶可以把集合作為輸入傳給和,命令會將集合看作是成員分值全為的有序集合來處理。上一篇文章實戰(zhàn)第三章命令第四節(jié)散列下一篇文章實戰(zhàn)第三章命令第六節(jié)發(fā)布與訂閱
上一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第四節(jié):散列
下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第六節(jié):發(fā)布與訂閱
和散列存儲著鍵與值之間的映射類似,有序集合也存儲著成員與分值之間的映射,并且提供了分值處理命令,已經(jīng)根據(jù)分值大小有序的獲?。╢etch)和掃描(scan)成員和分值的命令。本書曾在第一章使用有序集合實現(xiàn)過基于發(fā)布時間排序的文章列表和基于投票數(shù)量排序的文章列表,還在第二章使用有序集合存儲過cookie的過期時間。
這些分值在Redis中以IEEE754雙精度點數(shù)的格式存儲。
本節(jié)將對操作有序集合的命令進行介紹,其中包括向有序集合添加新元素的命令、更細已有元素的命令、以及對有序集合進行交集運算和并集運算的命令。
下表展示了一部分常用的有序集合命令:
命令 | 用例 | 用例描述 |
---|---|---|
zadd | zadd key-name score memeber [score member ...] | 將帶有給定分值的成員添加到有序集合里面 |
zrem | zrem key-name member [member ...] | 從有序集合里面移除給定的成員,并返回被移除成員的數(shù)量 |
zcard | zcard key-name | 返回有序集合包含的成員數(shù)量 |
zincrby | zincrby key-name increment member | 將merber成員的分值加上increment |
zcount | zcount key-name min max | 返回分值介于min和max之間的成員數(shù)量 |
zrank | zrank key-name member | 返回成員member有序集合中的排名。 |
zscore | zsore key-name member | 返回成員member的分值 |
zrange | zrange key-name start stop [WITHSCORES] | 返回有序集合中排名介于start和stop之間的成員,如果給定了可選的WITHSCORES選項,那么命令會將成員的分值也一并返回。 |
實例:
import redis # 導入redis包包 # 與本地redis進行鏈接,地址為:localhost,端口號為6379 r = redis.StrictRedis(host="localhost", port=6379) r.delete("zset-key") print(r.zadd("zset-key",3,"a",2,"b",1,"c")) print(r.zcard("zset-key")) print(r.zincrby("zset-key","c",3)) print(r.zscore("zset-key","b")) print(r.zrank("zset-key","c")) #返回介于0-3之間的成員數(shù)量 print(r.zcount("zset-key",0,3)) print(r.zrem("zset-key","b")) print(r.zrange("zset-key",0,-1,withscores=True))
結果:
3 3 4.0 2.0 2 2 1 [(b"a", 3.0), (b"c", 4.0)]
因為zadd、zrem、zincrby、zscore和zrange都已經(jīng)在第一章和第二章介紹過了,所以讀者應該不會對它們感到陌生。zcount命令和其他命令不太相同,它主要擁擠計算分值在給定范圍內(nèi)的成員數(shù)量。
下表展示了另外一些非常有用的有序集合命令:
有序集合的范圍型數(shù)據(jù)獲取命令和范圍型數(shù)據(jù)刪除命令,以及并集命令和交集命令:
命令 | 用例 | 用例描述 |
---|---|---|
zrevrank | zrevrank key-name merber | 返回有序集合里面成員member的排名,成員按照分值從大到小排列 |
zrevrange | zrevrange key-name start stop [WITHSCORES] | 返回有序集合給定排名范圍內(nèi)的成員,成員按照分值從大到小排列 |
zrangebysocre | zrangebyscore by min max [WITHSCORES] [LIMIT offset count] | 返回有序集合中,分值介于min和max之間的所有成員。 |
zrevrangebyscore | zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count] | 獲取有序集合中分值介于min和max之間的所有成員,并按照分值從大到小的順序來返回它們。 |
zremrangebyrank | zremrangebyrank key-name start stop | 移除有序集合中排名介于start和stop之間的所有成員。 |
zremrangebyscore | zremrangebyscore key-name min max | 移除有序集合中分值介于min和max之間的所有成員。 |
zinterstore | zinterstore dest-key key-count key [key ...] | 對給定的有序集合執(zhí)行類似于集合的交集運算。 |
zunionstore | zunionstore dest-key key-count key [key ...] [weights weight [weight ...]][aggregate summinmax] | 對給定的有序集合執(zhí)行類似于集合的并集運算。 |
上表展示的命令里面,有幾個是之前沒介紹過的新命令。除了使用逆序來處理有序集合之外,zrev*命令的工作方式和相對應的非逆序命令的工作方式完全一樣(逆序就是指元素按照從大到小地排列)。
實例:
import redis # 導入redis包包 # 與本地redis進行鏈接,地址為:localhost,端口號為6379 r = redis.StrictRedis(host="localhost", port=6379) r.delete("zset-key1") r.delete("zset-key2") r.delete("zset-key-i") r.delete("zset-key-u") r.delete("zset-key-u2") r.delete("set-1") #首先創(chuàng)建兩個有序集合 #a b c d #1 2 3 # 4 1 0 print(r.zadd("zset-key1",1,"a",2,"b",3,"c")) print(r.zadd("zset-key2",4,"b",1,"c",0,"d")) #zinterstore和zunionstore默認使用的聚合函數(shù)為sum,這個函數(shù)會把各個有序集合的成員的分值都加起來 print(r.zinterstore("zset-key-i",["zset-key1","zset-key2"])) print(r.zrange("zset-key-i",0,-1,withscores=True)) #用戶可以在執(zhí)行并集運算和交集運算的時候傳入不同的聚合函數(shù),共有sum、min、max三個聚合函數(shù)可選。 print(r.zunionstore("zset-key-u",["zset-key1","zset-key2"],aggregate="min")) print(r.zrange("zset-key-u",0,-1,withscores=True)) print(r.sadd("set-1","a","d")) #用戶可以把集合作為輸入傳給zinterstore和zunionstore,命令會將集合看作是成員分值全為1的有序集合來處理。 print(r.zunionstore("zset-key-u2",["zset-key1","zset-key2","set-1"])) print(r.zrange("zset-key-u2",0,-1,withscores=True))
結果:
3 3 2 [(b"c", 4.0), (b"b", 6.0)] 4 [(b"d", 0.0), (b"a", 1.0), (b"c", 1.0), (b"b", 2.0)] 2 4 [(b"d", 1.0), (b"a", 2.0), (b"c", 4.0), (b"b", 6.0)]
有序集合的并集運算和交集運算在剛開始接觸時可能會比較難懂,我們將以表格來展示交集運算和并集運算的執(zhí)行過程。
對兩個輸入有序集合執(zhí)行【交集】運算并得到輸出有序集合這次交集運算使用的是默認的聚合函數(shù)sum,所有輸出有序集合成員的分值都是通過加法計算得到的。
zset-key1:
a | b | c | d |
---|---|---|---|
1 | 2 | 3 |
zset-key2
a | b | c | d |
---|---|---|---|
4 | 1 | 0 |
zset-key-i
a | b | c | d |
---|---|---|---|
6 | 4 |
執(zhí)行r.zinterstore("zset-key-i",["zset-key1","zset-key2"]),將使得同時存在于zset-key1和zset-key2里面的元素被添加到z-set-key-i中。對兩個輸入有序集合執(zhí)行【并集】運算并得到輸出有序集合
并集運算和交集運算不同,只要某個成員存在于至少一個輸入有序集合里面,那么這個成員就會被包含在輸出有序集合里面。下表展示了使用聚合函數(shù)min執(zhí)行并集運算的過程,min函數(shù)在多個輸入有序集合都包含同一個成員的情況下,會將最小的那個分值設置Wie這個成員的輸出有序集合的分值。
zset-key1
a | b | c | d |
---|---|---|---|
1 | 2 | 3 |
zset-key2
a | b | c | d |
---|---|---|---|
4 | 1 | 0 |
zset-key-u
a | b | c | d |
---|---|---|---|
1 | 2(取小的那個) | 1(取小的那個) | 0 |
執(zhí)行r.zunionstore("zset-key-u",["zset-key1","zset-key2"],aggregate="min"),會將存在于zset-key1或者zset-key2里面的元素通過min函數(shù)組合到zset-key-u里面。使用zunionstore命令來將兩個有序集合和一個集合組合成一個有序集合
zset-key1
a | b | c | d |
---|---|---|---|
1 | 2 | 3 |
zset-key2
a | b | c | d |
---|---|---|---|
4 | 1 | 0 |
set-1
a | d |
---|
zset-key-u2
a | b | c | d |
---|---|---|---|
2 | 6 | 4 | 1 |
執(zhí)行r.zunionstore("zset-key-u2",["zset-key1","zset-key2","set-1"]),將使得所有存在于zset-key1、zset-key2或者set-1里面的元素都被添加到zset-key-u2里面
后面講使用zinterstore和zunionstore來構建幾個不同類型的搜索系統(tǒng),并說明如果通過可選的weights參數(shù)來以幾種不同的防暑組合有序集合的分值,從而使得集合和有序集合可以用于解決更多問題。
讀者在開發(fā)應用的過程中,也許曾經(jīng)聽說過發(fā)布與訂閱(publish、subscribe)模式,又稱pub/sub模式,Redis也實現(xiàn)了這種模式,接下來的一節(jié)將對其進行介紹。
上一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第四節(jié):散列
下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第六節(jié):發(fā)布與訂閱
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/44872.html
摘要:每個分值,函數(shù)就會刪除所有排名在名之后的商品,并將刪除之后剩余的所有商品的瀏覽次數(shù)減半。上一篇文章實戰(zhàn)第二章使用構建應用第四節(jié)數(shù)據(jù)行緩存下一篇文章實戰(zhàn)第三章命令第一節(jié)字符串 上一篇文章:Python--Redis實戰(zhàn):第二章:使用Redis構建Web應用:第四節(jié):數(shù)據(jù)行緩存下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第一節(jié):字符串 網(wǎng)站可以從用戶的訪問、交互、...
摘要:實例導入包包與本地進行鏈接,地址為,端口號為和字符串一樣,對散列中一個尚未存在的鍵執(zhí)行自增操作時,會將鍵的值當作來處理。 上一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第三節(jié):集合下一篇文章:Python--Redis實戰(zhàn):第三章:Redis命令:第五節(jié):有序集合 第一章提到過,Redis的散列可以讓用戶將多個鍵值對存儲到一個Redis里面。從功能上來說,Red...
閱讀 3271·2021-09-23 11:55
閱讀 2614·2021-09-13 10:33
閱讀 1670·2019-08-30 15:54
閱讀 3099·2019-08-30 15:54
閱讀 2367·2019-08-30 10:59
閱讀 2374·2019-08-29 17:08
閱讀 1807·2019-08-29 13:16
閱讀 3590·2019-08-26 12:25