国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python--Redis實(shí)戰(zhàn):第三章:Redis命令:第五節(jié):有序集合

xinhaip / 2143人閱讀

摘要:對(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

相關(guān)文章

  • Python--Redis實(shí)戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:五節(jié):網(wǎng)頁(yè)分析

    摘要:每個(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)站可以從用戶的訪問、交互、...

    rubyshen 評(píng)論0 收藏0
  • Python--Redis實(shí)戰(zhàn)三章Redis命令:第四節(jié):散列

    摘要:實(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...

    waterc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<