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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

集合多個各不相同的元素。小象科技讓你的數(shù)據(jù)產(chǎn)生價值集合(set)Redis

的集合以無序的方式

多個各不相同的元素。用戶可以快速地向集合添加元素,或者從集合里面刪除元素,也可以對多個集合進行集合運算操作,比如計算并集、交集和差集。示例:一個名為friends

的集合,保存了一些人名,他們可能是某個人的朋友們。小象科技讓你的數(shù)據(jù)產(chǎn)生價值小象科技讓你的數(shù)據(jù)產(chǎn)生價值元素操作添加元素、刪除元素、檢查元素是否存在、返回集合的大小,等等。添加元素SADD

key

element

[element

...]將一個或多個元素添加到給定的集合里面,已經(jīng)存在于集合的元素會自動被忽略,命令返回新添加到集合的元素數(shù)量。redis>

SADD

friends

"peter"(integer)

1redis>

SADD

friends

"jack"

"tom"

"john"(integer)

3redis>

SADD

friends

"may"

"tom"(integer)

1命令的復雜度為O(N),N

為成功添加的元素數(shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價值移除元素SREM

key

element

[element

...]移除集合中的一個或者多個元素,不存在于集合中的元素會自動被忽略,命令返回存在并且被移除的元素數(shù)量。redis>

SREM

friends

"peter"(integer)

1redis>

SREM

friends

"tom"

"john"(integer)

2命令的復雜度為O(N),N

為被移除元素的數(shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價值檢查給定元素是否存在于集合SISMEMBER

key

element檢查給定的元素是否存在于集合,存在的話返回1

;如果元素不存在,或者給定的鍵不存在,那么返回0

。redis>

SISMEMBER

friends

"peter"(integer)

1redis>

SISMEMBER

friends

"li

lei"(integer)

0redis>

SISMEMBER

NOT-EXISTS-KEY

"element"(integer)

0命令的復雜度為O(1)。小象科技讓你的數(shù)據(jù)產(chǎn)生價值返回集合的大小SCARD

key返回集合包含的元素數(shù)量(也即是集合的基數(shù))。redis>

SCARD

friends(integer)

6redis>

SREM

friends

"peter"

"jack"

"tom"(integer)

3redis>

SCARD

friends(integer)

3因為Redis

會集合的長度,所以命令的復雜度為O(1)。小象科技讓你的數(shù)據(jù)產(chǎn)生價值返回集合包含的所有元素SMEMBERS

key返回集合包含的所有元素。redis>

SMEMBERS

friends"jack""peter""may""tom""john""ben"命令的復雜度為O(N)

,N

為集合的大小。當集合的基數(shù)比較大時,執(zhí)行這個命令有可能會造成服務器阻塞,將來會介紹更好的方式來迭代集合中的元素。小象科技讓你的數(shù)據(jù)產(chǎn)生價值集合的無序性質(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"對于相同的一集元素,同一個集合命令可能會返回不同的

結(jié)果。結(jié)論:不要使用集合來 有序的數(shù)據(jù)。如果想要 有序且重復的值,可以使用列表;如果想要 有序且無重復的值,可以使用之后介紹的有序集合。小象科技讓你的數(shù)據(jù)產(chǎn)生價值示例:贊、喜歡、Like、簽到……除了 的贊之 上還有很多作用類似的功能,比如豆瓣的“喜歡”、

的“Like”、以及一些網(wǎng)站上的“簽到”等等。這些功能實際上都是一種投票功能,比如“贊”就是投一票,而“取消贊”就是撤銷自己的投票。通過使用

Redis

的集合, 也可以實現(xiàn)類似的投票功能。每個用戶可以點一次贊,也可以取消贊,也可以查看多少人贊了,以及哪些人贊了。小象科技讓你的數(shù)據(jù)產(chǎn)生價值投票功能的API

及其實現(xiàn)這個投票程序的實現(xiàn)源碼可以在vote.py

看到。API作用實現(xiàn)原理Vote(key,

client)將投票結(jié)果記錄到給定的鍵。使用集合來

所有已投票的人。Vote.cast(user)用戶進行投票。使用

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)生價值投票功能的使用示例like

=

Vote('weibo::10086::like',

client)#記錄ID

為10086的“贊”like.cast('peter')#'peter'贊了這條like.cast('john')

#'john'贊了這條like.cast('tom')like.undo('tom')#'tom'因為誤操作而贊了這條#然后它通過“取消”按鈕撤消了“贊”操作like.is_voted('peter')

#返回

True

,因為peter

已經(jīng)贊過了like.voted_members()

#返回

{'peter','john'}like.voted_count()

#返回

2小象科技讓你的數(shù)據(jù)產(chǎn)生價值示例:打功能豆瓣允許你在標記一本書的同時,為這本書添加,比如“Linux”、“系統(tǒng)編程”、“計算機”、“C”、“編程”,等等。使用

Redis

的集合也可以實現(xiàn)這樣的加

功能。小象科技讓你的數(shù)據(jù)產(chǎn)生價值打功能的API

及其實現(xiàn)這個打程序的實現(xiàn)代碼可以在tag.py

看到。API作用實現(xiàn)原理Tag(key,

client)使用指定的鍵來 某種東西的

。使用集合來

。Tag.add(*tags)添加任意多個

。調(diào)用SADD

命令。Tag.remove(*tags)移除任意多個

。調(diào)用SREM命令。Tag.is_include(tag)檢查某個

是否存在。調(diào)用SISMEMBER

命令。Tag.get_all()返回所有

。調(diào)用SMEMBERS

命令。Tag.count()返回

的數(shù)量。調(diào)用SCARD

命令。小象科技讓你的數(shù)據(jù)產(chǎn)生價值打

功能的使用示例#創(chuàng)建一個集合鍵來保存書本的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)生價值小象科技讓你的數(shù)據(jù)產(chǎn)生價值從集合里面隨機地彈出一個元素SPOPkey隨機地從集合中移除并返回一個元素,復雜度為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)生價值從集合里面隨機地返回元素SRANDMEMBER

key

[count]如果沒有給定可選的count

參數(shù),那么命令隨機地返回集合中的一個元素。如果給定了

count

參數(shù),那么:當count為正數(shù),并且少于集合基數(shù)時,命令返回一個包含count個元素的數(shù)組,數(shù)組中的每個元素各不相同。如果

count

大于或等于集合基數(shù),那么命令返回整個集合。當count

為負數(shù)時,命令返回一個數(shù)組,數(shù)組中的元素可能會重復出現(xiàn)多次,而數(shù)組的長度為count

的絕對值。和SPOP

不同,SRANDMEMBER

不會移除被返回的元素。命令的復雜度為O(N),N

為被返回元素的數(shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價值SRANDMEMBER

的使用示例redis>

SADD

friends

"peter"

"jack"

"tom"

"john"

"may"

"ben"(integer)

1redis>SRANDMEMBER

friends

#隨機地返回一個元素"ben"#隨機地返回三個無重復的元素redis>

SRANDMEMBER

friends

3"john""jack""peter"#隨機地返回三個可能有重復的元素redis>

SRANDMEMBER

friends

-3"may""peter""may"示例:抽獎系統(tǒng)上的轉(zhuǎn)發(fā)抽獎活動:每個參與者只需要進行轉(zhuǎn)發(fā),就有機會獲得獎品。通過將參與抽獎的所有人都添加到一個集合里面,并使用SRANDMEMBER

命令來抽取獲獎得主,

也可以構建一個類似的抽獎功能。小象科技讓你的數(shù)據(jù)產(chǎn)生價值抽獎程序的API

及其實現(xiàn)這個抽象程序的實現(xiàn)代碼可以在

loterry.py

找到。API作用實現(xiàn)原理Loterry(key,

client)使用指定的鍵來 參與抽獎的人。使用集合來 參與抽獎的人。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

個獲獎者。調(diào)用SRANDMEMBER

命令。小象科技讓你的數(shù)據(jù)產(chǎn)生價值抽獎程序的使用示例#

創(chuàng)建一個

Redis

書的抽獎活動book_loterry('loterry::redis_book',

client)#不斷地添加參與者book_loterry.add_player('peter',

'jack',

'tom',

'may',

...,

'ben')#抽出三名幸運的獲獎者book_loterry.draw(3)小象科技讓你的數(shù)據(jù)產(chǎn)生價值小象科技讓你的數(shù)據(jù)產(chǎn)生價值集合運算操作計算并集、交集和差集。差集運算redis>

SADD

number1

"123"

"456"

"789"(integer)

3redis>

SADD

number2

"123"

"456"

"999"(integer)

3redis>

SDIFF

number1

number21)

"789"來自《離散數(shù)學及其應用(第7版)》命令作用復雜度SDIFF

key

[key

...]計算所有給定集合的差集,并返回結(jié)果。O(N),N

為所有參與差集計算的元素數(shù)量之和。SDIFFSTORE

destkey

key

[key

...]計算所有給定集合的差集,并將結(jié)果 到

destkey

。O(N),N

為所有參與差集計算的元素數(shù)量之和。小象科技讓你的數(shù)據(jù)產(chǎn)生價值交集運算redis>

SADD

number1"123"

"456"

"789"(integer)

3redis>

SADD

number2"123"

"456"

"887"(integer)

3redis>

SINTER

number1

number21)

"123"2)

"456"命令作用復雜度SINTER

key

[key

...]計算所有給定集合的交集,并返回結(jié)果。O(N

*

M),N

為給定集合當中基數(shù)最小的集合,M

為給定集合的個數(shù)。SINTERSTORE

destkey

key

[key

...]計算所有給定集合的交集,并將結(jié)果 到

destkey

。O(N

*

M),N

為給定集合當中基數(shù)最小的集合,M

為給定集合的個數(shù)。小象科技讓你的數(shù)據(jù)產(chǎ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"命令作用復雜度SUNION

key

[key

...]計算所有給定集合的并集,并返回結(jié)果。O(N),N

為所有參與計算的元素數(shù)量。SUNIONSTORE

destkey

key

[key

...]計算所有給定集合的并集,并將結(jié)果 到

destkey

。O(N),N

為所有參與計算的元素數(shù)量。小象科技讓你的數(shù)據(jù)產(chǎn)生價值示例:使用集合實現(xiàn)共同關注功能的共同關注功能:當用戶

另一個用戶時,該功能會顯示出兩個用戶關注了哪些相同的用戶。如果 把每個用戶的關注對象都分別放到一個集合里面的話,那么

可以使用SINTER或者

SINTERSTORE命令來實現(xiàn)這個共同關注功能。例如:peter

=

{'john',

'jack',

'may'}ben

=

{'john',

'jack',

'tom'}那么

peter

和ben

的共同關注為:SINTER

peter

ben

=

{'john',

'jack'}還可以使用SINTERSTORE

來避免重復計算。小象科技讓你的數(shù)據(jù)產(chǎn)生價值示例:構建商品篩選功能京東上的一個行篩選。篩選系統(tǒng),用戶可以根據(jù)品牌、價格、網(wǎng)絡、屏幕尺寸等條件,對商品進對于每個條件的每個選項,

可以使用一個集合來保存

該選項對應的所有商品,并通過在多個選項之間進行交集計算,從而達到篩選的目的。小象科技讓你的數(shù)據(jù)產(chǎn)生價值示例:構建商品篩選功能對于品牌條件,

可以創(chuàng)建這樣的集合,比如

apple

=

{

'{'Galaxy

S5','Galaxy

S4',...},諸如此類。5c','iPhons

5s',...},而samsung=而對于價格條件,

可以創(chuàng)建這樣的集合,比如

price_2900_to_4099

=

{

'GalaxyS5',

'GalaxyS4',...}

,以及

price_uppon_4100

=

{

' 5c',' 5S',

...}

,諸如此類。每當用戶添加一個過濾選項時,

就計算出所有被選中選項的交集,而交集的計算結(jié)果就是符合篩選條件的商品。小象科技讓你的數(shù)據(jù)產(chǎn)生價值示例:構建商品篩選功能ZINTER

apple

price_uppon_5200‘ 5s

32G’_wcdma當然,每次過濾都要計算一次交集的話,速度就太慢

了,因此 可以預先計算好,然后把結(jié)果

在一個固定的地方,比如:ZINTERSTOREapple&priceapple

price_uppon_5200_wcdma_wcdmaSMEMBERapple&price_wcdma小象科技讓你的數(shù)據(jù)產(chǎn)生價值商品篩選功能的實現(xiàn)及其API這個商品篩選功能的實現(xiàn)代碼可以在item_filter.py

看到。API作用實現(xiàn)原理ItemFilter(client)指定客戶端。ItemFilter.add_option(item_set)添加一個篩選條件選項,item_set集合 了所有符合該選項的商品。把ite

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論