版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
集合多個(gè)各不相同的元素。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值集合(set)Redis
的集合以無(wú)序的方式
多個(gè)各不相同的元素。用戶可以快速地向集合添加元素,或者從集合里面刪除元素,也可以對(duì)多個(gè)集合進(jìn)行集合運(yùn)算操作,比如計(jì)算并集、交集和差集。示例:一個(gè)名為friends
的集合,保存了一些人名,他們可能是某個(gè)人的朋友們。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值元素操作添加元素、刪除元素、檢查元素是否存在、返回集合的大小,等等。添加元素SADD
key
element
[element
...]將一個(gè)或多個(gè)元素添加到給定的集合里面,已經(jīng)存在于集合的元素會(huì)自動(dòng)被忽略,命令返回新添加到集合的元素?cái)?shù)量。redis>
SADD
friends
"peter"(integer)
1redis>
SADD
friends
"jack"
"tom"
"john"(integer)
3redis>
SADD
friends
"may"
"tom"(integer)
1命令的復(fù)雜度為O(N),N
為成功添加的元素?cái)?shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值移除元素SREM
key
element
[element
...]移除集合中的一個(gè)或者多個(gè)元素,不存在于集合中的元素會(huì)自動(dòng)被忽略,命令返回存在并且被移除的元素?cái)?shù)量。redis>
SREM
friends
"peter"(integer)
1redis>
SREM
friends
"tom"
"john"(integer)
2命令的復(fù)雜度為O(N),N
為被移除元素的數(shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值檢查給定元素是否存在于集合SISMEMBER
key
element檢查給定的元素是否存在于集合,存在的話返回1
;如果元素不存在,或者給定的鍵不存在,那么返回0
。redis>
SISMEMBER
friends
"peter"(integer)
1redis>
SISMEMBER
friends
"li
lei"(integer)
0redis>
SISMEMBER
NOT-EXISTS-KEY
"element"(integer)
0命令的復(fù)雜度為O(1)。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值返回集合的大小SCARD
key返回集合包含的元素?cái)?shù)量(也即是集合的基數(shù))。redis>
SCARD
friends(integer)
6redis>
SREM
friends
"peter"
"jack"
"tom"(integer)
3redis>
SCARD
friends(integer)
3因?yàn)镽edis
會(huì)集合的長(zhǎng)度,所以命令的復(fù)雜度為O(1)。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值返回集合包含的所有元素SMEMBERS
key返回集合包含的所有元素。redis>
SMEMBERS
friends"jack""peter""may""tom""john""ben"命令的復(fù)雜度為O(N)
,N
為集合的大小。當(dāng)集合的基數(shù)比較大時(shí),執(zhí)行這個(gè)命令有可能會(huì)造成服務(wù)器阻塞,將來(lái)會(huì)介紹更好的方式來(lái)迭代集合中的元素。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值集合的無(wú)序性質(zhì)redis>
SADD
friends
"peter"
"jack"
"tom"
"john""may"
"ben"(integer)
6redis>
SMEMBERS
friends"jack""peter""may""tom""john""ben"redis>
SADD
another-friends
"ben"
"may"
"john""tom"
"jack"
"peter"(integer)
6redis>
SMEMBERS
another-friends"may""ben""john""tom""jack""peter"對(duì)于相同的一集元素,同一個(gè)集合命令可能會(huì)返回不同的
結(jié)果。結(jié)論:不要使用集合來(lái) 有序的數(shù)據(jù)。如果想要 有序且重復(fù)的值,可以使用列表;如果想要 有序且無(wú)重復(fù)的值,可以使用之后介紹的有序集合。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值示例:贊、喜歡、Like、簽到……除了 的贊之 上還有很多作用類似的功能,比如豆瓣的“喜歡”、
的“Like”、以及一些網(wǎng)站上的“簽到”等等。這些功能實(shí)際上都是一種投票功能,比如“贊”就是投一票,而“取消贊”就是撤銷自己的投票。通過(guò)使用
Redis
的集合, 也可以實(shí)現(xiàn)類似的投票功能。每個(gè)用戶可以點(diǎn)一次贊,也可以取消贊,也可以查看多少人贊了,以及哪些人贊了。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值投票功能的API
及其實(shí)現(xiàn)這個(gè)投票程序的實(shí)現(xiàn)源碼可以在vote.py
看到。API作用實(shí)現(xiàn)原理Vote(key,
client)將投票結(jié)果記錄到給定的鍵。使用集合來(lái)
所有已投票的人。Vote.cast(user)用戶進(jìn)行投票。使用
SADD
將用戶添加到集合里面。Vote.undo(user)取消用戶的投票。使用
SREM
將用戶從集合中移除。Vote.is_voted(user)檢查用戶是否已投票。使用SISMEMBER
檢查用戶是否存在于集合。Vote.voted_members()返回所有已投票用戶。調(diào)用SMEMBERS
。Vote.voted_count()返回已投票用戶的數(shù)量。調(diào)用SCARD
。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值投票功能的使用示例like
=
Vote('weibo::10086::like',
client)#記錄ID
為10086的“贊”like.cast('peter')#'peter'贊了這條like.cast('john')
#'john'贊了這條like.cast('tom')like.undo('tom')#'tom'因?yàn)檎`操作而贊了這條#然后它通過(guò)“取消”按鈕撤消了“贊”操作like.is_voted('peter')
#返回
True
,因?yàn)閜eter
已經(jīng)贊過(guò)了like.voted_members()
#返回
{'peter','john'}like.voted_count()
#返回
2小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值示例:打功能豆瓣允許你在標(biāo)記一本書的同時(shí),為這本書添加,比如“Linux”、“系統(tǒng)編程”、“計(jì)算機(jī)”、“C”、“編程”,等等。使用
Redis
的集合也可以實(shí)現(xiàn)這樣的加
功能。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值打功能的API
及其實(shí)現(xiàn)這個(gè)打程序的實(shí)現(xiàn)代碼可以在tag.py
看到。API作用實(shí)現(xiàn)原理Tag(key,
client)使用指定的鍵來(lái) 某種東西的
。使用集合來(lái)
。Tag.add(*tags)添加任意多個(gè)
。調(diào)用SADD
命令。Tag.remove(*tags)移除任意多個(gè)
。調(diào)用SREM命令。Tag.is_include(tag)檢查某個(gè)
是否存在。調(diào)用SISMEMBER
命令。Tag.get_all()返回所有
。調(diào)用SMEMBERS
命令。Tag.count()返回
的數(shù)量。調(diào)用SCARD
命令。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值打
功能的使用示例#創(chuàng)建一個(gè)集合鍵來(lái)保存書本的book_tag
=
Tag('Linux
System
Programming
::
Tag',
client)#給書本打book_tag.add('linux',
'system
programming',
'c',
'windows')#獲取書本的所有book_tag.
get_all()#移除指定的book_tag.remove('windows')小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值從集合里面隨機(jī)地彈出一個(gè)元素SPOPkey隨機(jī)地從集合中移除并返回一個(gè)元素,復(fù)雜度為O(1)。redis>
SADD
friends
"peter"
"jack"
"tom"
"john"
"may"
"ben"(integer)
6redis>
SPOP
friends"may"redis>
SMEMBERS
friends"tom""john""jack""peter""ben"小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值從集合里面隨機(jī)地返回元素SRANDMEMBER
key
[count]如果沒(méi)有給定可選的count
參數(shù),那么命令隨機(jī)地返回集合中的一個(gè)元素。如果給定了
count
參數(shù),那么:當(dāng)count為正數(shù),并且少于集合基數(shù)時(shí),命令返回一個(gè)包含count個(gè)元素的數(shù)組,數(shù)組中的每個(gè)元素各不相同。如果
count
大于或等于集合基數(shù),那么命令返回整個(gè)集合。當(dāng)count
為負(fù)數(shù)時(shí),命令返回一個(gè)數(shù)組,數(shù)組中的元素可能會(huì)重復(fù)出現(xiàn)多次,而數(shù)組的長(zhǎng)度為count
的絕對(duì)值。和SPOP
不同,SRANDMEMBER
不會(huì)移除被返回的元素。命令的復(fù)雜度為O(N),N
為被返回元素的數(shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值SRANDMEMBER
的使用示例redis>
SADD
friends
"peter"
"jack"
"tom"
"john"
"may"
"ben"(integer)
1redis>SRANDMEMBER
friends
#隨機(jī)地返回一個(gè)元素"ben"#隨機(jī)地返回三個(gè)無(wú)重復(fù)的元素redis>
SRANDMEMBER
friends
3"john""jack""peter"#隨機(jī)地返回三個(gè)可能有重復(fù)的元素redis>
SRANDMEMBER
friends
-3"may""peter""may"示例:抽獎(jiǎng)系統(tǒng)上的轉(zhuǎn)發(fā)抽獎(jiǎng)活動(dòng):每個(gè)參與者只需要進(jìn)行轉(zhuǎn)發(fā),就有機(jī)會(huì)獲得獎(jiǎng)品。通過(guò)將參與抽獎(jiǎng)的所有人都添加到一個(gè)集合里面,并使用SRANDMEMBER
命令來(lái)抽取獲獎(jiǎng)得主,
也可以構(gòu)建一個(gè)類似的抽獎(jiǎng)功能。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值抽獎(jiǎng)程序的API
及其實(shí)現(xiàn)這個(gè)抽象程序的實(shí)現(xiàn)代碼可以在
loterry.py
找到。API作用實(shí)現(xiàn)原理Loterry(key,
client)使用指定的鍵來(lái) 參與抽獎(jiǎng)的人。使用集合來(lái) 參與抽獎(jiǎng)的人。Loterry.add_player(*user)添加參與者。調(diào)用SADD
命令。Loterry.get_all_players()返回所有參與者。調(diào)用SMEMBERS
命令。Loterry.player_count()返回參與者數(shù)量。調(diào)用SCARD
命令。Loterry.draw(n)抽出n
個(gè)獲獎(jiǎng)?wù)?。調(diào)用SRANDMEMBER
命令。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值抽獎(jiǎng)程序的使用示例#
創(chuàng)建一個(gè)
Redis
書的抽獎(jiǎng)活動(dòng)book_loterry('loterry::redis_book',
client)#不斷地添加參與者book_loterry.add_player('peter',
'jack',
'tom',
'may',
...,
'ben')#抽出三名幸運(yùn)的獲獎(jiǎng)?wù)遙ook_loterry.draw(3)小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值集合運(yùn)算操作計(jì)算并集、交集和差集。差集運(yùn)算redis>
SADD
number1
"123"
"456"
"789"(integer)
3redis>
SADD
number2
"123"
"456"
"999"(integer)
3redis>
SDIFF
number1
number21)
"789"來(lái)自《離散數(shù)學(xué)及其應(yīng)用(第7版)》命令作用復(fù)雜度SDIFF
key
[key
...]計(jì)算所有給定集合的差集,并返回結(jié)果。O(N),N
為所有參與差集計(jì)算的元素?cái)?shù)量之和。SDIFFSTORE
destkey
key
[key
...]計(jì)算所有給定集合的差集,并將結(jié)果 到
destkey
。O(N),N
為所有參與差集計(jì)算的元素?cái)?shù)量之和。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值交集運(yùn)算redis>
SADD
number1"123"
"456"
"789"(integer)
3redis>
SADD
number2"123"
"456"
"887"(integer)
3redis>
SINTER
number1
number21)
"123"2)
"456"命令作用復(fù)雜度SINTER
key
[key
...]計(jì)算所有給定集合的交集,并返回結(jié)果。O(N
*
M),N
為給定集合當(dāng)中基數(shù)最小的集合,M
為給定集合的個(gè)數(shù)。SINTERSTORE
destkey
key
[key
...]計(jì)算所有給定集合的交集,并將結(jié)果 到
destkey
。O(N
*
M),N
為給定集合當(dāng)中基數(shù)最小的集合,M
為給定集合的個(gè)數(shù)。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值并集運(yùn)算redis>
SADD
number1
"123"
"456"
"789"(integer)
3redis>
SADD
number2
"123"
"456"
"887"(integer)
3redis>
SUNION
number1
number21)
"123"2)
"456"3)
"789"4)
"887"命令作用復(fù)雜度SUNION
key
[key
...]計(jì)算所有給定集合的并集,并返回結(jié)果。O(N),N
為所有參與計(jì)算的元素?cái)?shù)量。SUNIONSTORE
destkey
key
[key
...]計(jì)算所有給定集合的并集,并將結(jié)果 到
destkey
。O(N),N
為所有參與計(jì)算的元素?cái)?shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值示例:使用集合實(shí)現(xiàn)共同關(guān)注功能的共同關(guān)注功能:當(dāng)用戶
另一個(gè)用戶時(shí),該功能會(huì)顯示出兩個(gè)用戶關(guān)注了哪些相同的用戶。如果 把每個(gè)用戶的關(guān)注對(duì)象都分別放到一個(gè)集合里面的話,那么
可以使用SINTER或者
SINTERSTORE命令來(lái)實(shí)現(xiàn)這個(gè)共同關(guān)注功能。例如:peter
=
{'john',
'jack',
'may'}ben
=
{'john',
'jack',
'tom'}那么
peter
和ben
的共同關(guān)注為:SINTER
peter
ben
=
{'john',
'jack'}還可以使用SINTERSTORE
來(lái)避免重復(fù)計(jì)算。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值示例:構(gòu)建商品篩選功能京東上的一個(gè)行篩選。篩選系統(tǒng),用戶可以根據(jù)品牌、價(jià)格、網(wǎng)絡(luò)、屏幕尺寸等條件,對(duì)商品進(jìn)對(duì)于每個(gè)條件的每個(gè)選項(xiàng),
可以使用一個(gè)集合來(lái)保存
該選項(xiàng)對(duì)應(yīng)的所有商品,并通過(guò)在多個(gè)選項(xiàng)之間進(jìn)行交集計(jì)算,從而達(dá)到篩選的目的。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值示例:構(gòu)建商品篩選功能對(duì)于品牌條件,
可以創(chuàng)建這樣的集合,比如
apple
=
{
'{'Galaxy
S5','Galaxy
S4',...},諸如此類。5c','iPhons
5s',...},而samsung=而對(duì)于價(jià)格條件,
可以創(chuàng)建這樣的集合,比如
price_2900_to_4099
=
{
'GalaxyS5',
'GalaxyS4',...}
,以及
price_uppon_4100
=
{
' 5c',' 5S',
...}
,諸如此類。每當(dāng)用戶添加一個(gè)過(guò)濾選項(xiàng)時(shí),
就計(jì)算出所有被選中選項(xiàng)的交集,而交集的計(jì)算結(jié)果就是符合篩選條件的商品。小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值示例:構(gòu)建商品篩選功能ZINTER
apple
price_uppon_5200‘ 5s
32G’_wcdma當(dāng)然,每次過(guò)濾都要計(jì)算一次交集的話,速度就太慢
了,因此 可以預(yù)先計(jì)算好,然后把結(jié)果
在一個(gè)固定的地方,比如:ZINTERSTOREapple&priceapple
price_uppon_5200_wcdma_wcdmaSMEMBERapple&price_wcdma小象科技讓你的數(shù)據(jù)產(chǎn)生價(jià)值商品篩選功能的實(shí)現(xiàn)及其API這個(gè)商品篩選功能的實(shí)現(xiàn)代碼可以在item_filter.py
看到。API作用實(shí)現(xiàn)原理ItemFilter(client)指定客戶端。ItemFilter.add_option(item_set)添加一個(gè)篩選條件選項(xiàng),item_set集合 了所有符合該選項(xiàng)的商品。把ite
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 9755-2024合成樹脂乳液墻面涂料
- 工廠整改報(bào)告-企業(yè)管理
- 銀行信息系統(tǒng)安全管理制度
- 銀行合規(guī)管理制度優(yōu)化
- 酒店餐飲服務(wù)規(guī)范及質(zhì)量控制制度
- 零售媒體化專項(xiàng)研究報(bào)告(2024年)
- 《信號(hào)形成處理記錄》課件
- 克萊斯勒鉑銳不啟動(dòng)防盜系統(tǒng)診斷案例
- 《議論文結(jié)構(gòu)布局》課件
- 全國(guó)百?gòu)?qiáng)名校2025屆高考英語(yǔ)三模試卷含解析
- psa制氧機(jī)工藝流程圖
- 基于PLC控制的機(jī)械手設(shè)計(jì)
- 生殖道感染和性傳播感染課件
- 市場(chǎng)營(yíng)銷原理與實(shí)踐第17版
- 施工安全管理經(jīng)驗(yàn)分享
- 2024年浙江杭州杭港地鐵有限公司招聘筆試參考題庫(kù)含答案解析
- 江蘇南京鼓樓區(qū)2023-2024九年級(jí)上學(xué)期期末語(yǔ)文試卷及答案
- 河南汽車工廠48萬(wàn)臺(tái)乘用車發(fā)動(dòng)機(jī)建設(shè)項(xiàng)目竣工環(huán)境保護(hù)驗(yàn)收監(jiān)測(cè)報(bào)告
- 2023-2024學(xué)年四川省成都市金牛區(qū)八年級(jí)(上)期末數(shù)學(xué)試卷
- 德邦物流-第三方物流服務(wù)
- 安全生產(chǎn)責(zé)任清單培訓(xùn)會(huì)
評(píng)論
0/150
提交評(píng)論