redis入門到精通-課程配套第5講集合_第1頁(yè)
redis入門到精通-課程配套第5講集合_第2頁(yè)
redis入門到精通-課程配套第5講集合_第3頁(yè)
redis入門到精通-課程配套第5講集合_第4頁(yè)
redis入門到精通-課程配套第5講集合_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論