Redis數(shù)據(jù)類(lèi)型 - Sets

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ù)元素的功能萎战。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市舆逃,隨后出現(xiàn)的幾起案子蚂维,更是在濱河造成了極大的恐慌,老刑警劉巖路狮,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虫啥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奄妨,警方通過(guò)查閱死者的電腦和手機(jī)涂籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)砸抛,“玉大人评雌,你說(shuō)我怎么就攤上這事∶痰浚” “怎么了柳骄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)箕般。 經(jīng)常有香客問(wèn)我耐薯,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任曲初,我火速辦了婚禮体谒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臼婆。我一直安慰自己抒痒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布颁褂。 她就那樣靜靜地躺著艘狭,像睡著了一般鹦倚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天掠哥,我揣著相機(jī)與錄音繁疤,去河邊找鬼鹏浅。 笑死貌亭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠柑。 我是一名探鬼主播寨辩,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歼冰!你這毒婦竟也來(lái)了靡狞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤隔嫡,失蹤者是張志新(化名)和其女友劉穎耍攘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畔勤,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年扒磁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庆揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妨托,死狀恐怖缸榛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兰伤,我是刑警寧澤内颗,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站敦腔,受9級(jí)特大地震影響均澳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一找前、第九天 我趴在偏房一處隱蔽的房頂上張望糟袁。 院中可真熱鬧,春花似錦躺盛、人聲如沸项戴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)周叮。三九已至,卻和暖如春界斜,著一層夾襖步出監(jiān)牢的瞬間仿耽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工锄蹂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氓仲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓得糜,卻偏偏與公主長(zhǎng)得像敬扛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朝抖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容