Redis Sets是字符串的無(wú)序集合掷酗。SADD命令向集合添加新元素调违。還可以對(duì)集合執(zhí)行一些其他操作,比如檢查給定的元素是否已經(jīng)存在泻轰,取多個(gè)集合的交集技肩、并集和差集,等等。
127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
這里虚婿,我向集合中添加了三個(gè)元素旋奢,并告訴Redis返回所有元素。
Redis有檢查成員關(guān)系的命令然痊。例如至朗,檢查一個(gè)元素是否存在:
127.0.0.1:6379> sismember myset 3
(integer) 1 #“3”是集合的成員
127.0.0.1:6379> sismember myset 30
(integer) 0 #“30”不是
Sets適合用于表示對(duì)象之間的關(guān)系。例如剧浸,我們可以很容易地使用集合來(lái)實(shí)現(xiàn)標(biāo)記锹引。
解決這個(gè)問(wèn)題的一個(gè)簡(jiǎn)單模型是為我們想要標(biāo)記的每個(gè)對(duì)象設(shè)置一個(gè)集合。該集合包含與對(duì)象關(guān)聯(lián)的標(biāo)記的id唆香。
一個(gè)例子是給新聞文章加標(biāo)簽嫌变。如果article ID 1000被標(biāo)記上標(biāo)簽1、2躬它、5和77腾啥,用一個(gè)集合可以將這些標(biāo)簽ID與新聞關(guān)聯(lián)起來(lái):
127.0.0.1:6379> sadd news:1000:tags 1 2 5 77
(integer) 4
我們可能還想要有反向關(guān)系:一個(gè)給定的標(biāo)簽所標(biāo)記的所有新聞:
127.0.0.1:6379> sadd tag:1:news 1000
(integer) 1
127.0.0.1:6379> sadd tag:2:news 1000
(integer) 1
127.0.0.1:6379> sadd tag:5:news 1000
(integer) 1
127.0.0.1:6379> sadd tag:77:news 1000
(integer) 1
獲取指定對(duì)象的所有標(biāo)記很簡(jiǎn)單:
127.0.0.1:6379> smembers news:1000:tags
1) "1"
2) "2"
3) "5"
4) "77"
注意:在這個(gè)示例中,我們假設(shè)你有另一個(gè)數(shù)據(jù)結(jié)構(gòu)虑凛,例如Redis Hashes碑宴,它將標(biāo)記id映射到標(biāo)記名稱。
使用正確的Redis命令還可以輕松實(shí)現(xiàn)其他一些重要的操作桑谍。例如,我們可能需要一個(gè)包含所有標(biāo)記1祸挪、2锣披、10和27的對(duì)象的列表。我們可以使用SINTER命令來(lái)實(shí)現(xiàn)這一點(diǎn)贿条,它獲取不同集合之間的交集雹仿。我們可以使用:
127.0.0.1:6379> sinter tag:1:news tag:2:news tag:10:news tag:27:news
除了交集,還可以獲取并集整以、差集胧辽、提取隨機(jī)元素等等。
提取元素的命令是SPOP公黑,對(duì)處理某些問(wèn)題非常方便邑商。例如,為了實(shí)現(xiàn)網(wǎng)絡(luò)撲克游戲凡蚜,您可能想要用一個(gè)集合表示您的牌組人断。假設(shè)我們使用一個(gè)字符前綴表示梅花(C)lub、方塊(D)iamonds朝蜘、紅心(H)earts恶迈、黑桃(S)pades:
127.0.0.1:6379> sadd deck C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 CJ CQ CK D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 DJ DQ DK H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 HJ HQ HK S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 SJ SQ SK
(integer) 52
現(xiàn)在我們想為每個(gè)玩家提供5張牌。SPOP命令刪除一個(gè)隨機(jī)元素谱醇,并將其返回給客戶端暇仲,因此在本例中這是一個(gè)完美的操作步做。
然而,如果我們直接對(duì)牌組調(diào)用SPOP奈附,在下一局游戲中全度,我們需要再次創(chuàng)建牌組,這可能不太理想桅狠。我們可以在開(kāi)局之前將存儲(chǔ)在deck鍵中的集合復(fù)制到game:1:deck鍵中讼载。
這是通過(guò)SUNIONSTORE實(shí)現(xiàn)的,它可以取多個(gè)集合之間的并集中跌,并將結(jié)果存儲(chǔ)到另一個(gè)集合中咨堤。然而,一個(gè)集合的并集就是它本身漩符,可以用下面的方式復(fù)制一個(gè)集合:
127.0.0.1:6379> SUNIONSTORE game:1:deck deck
(integer) 52
現(xiàn)在我準(zhǔn)備為第一個(gè)玩家提供五張牌:
> spop game:1:deck
"C6"
> spop game:1:deck
"CQ"
> spop game:1:deck
"D1"
> spop game:1:deck
"CJ"
> spop game:1:deck
"SJ"
這是引入另一個(gè)set命令的好時(shí)機(jī)一喘,該命令提供了集合中元素的數(shù)量。通常在集合理論上下文中稱為集合的基數(shù)嗜暴,此Redis命令稱為SCARD凸克。
127.0.0.1:6379> scard game:1:deck
(integer) 47 #52-5=47
當(dāng)您只需要獲取隨機(jī)元素而不從集合中刪除它們時(shí),有一個(gè)SRANDMEMBER命令適合于此任務(wù)闷沥。它還具有同時(shí)返回重復(fù)元素和非重復(fù)元素的功能萎战。