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