天天看點

【Redis筆記】Redis Sets

Redis Sets —

Redis Set 是 String 的無序排列。

SADD

 指令把新的元素添加到 set 中。對 set 也可做一些其他的操作,比如測試一個給定的元素是否存在,對不同 set 取交集,并集或差,等等。

> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2
           

現在我已經把三個元素加到我的 set 中,并告訴 Redis 傳回所有的元素。可以看到,它們沒有被排序 —— Redis 在每次調用時可能按照任意順序傳回元素,因為對于元素的順序并沒有規定。

Redis 有檢測成員的指令。一個特定的元素是否存在?

> sismember myset 3
(integer) 1
> sismember myset 30
(integer) 0
           

“3” 是 set 的一個成員,而 “30” 不是。

Sets 适合用于表示對象間的關系。 例如,我們可以輕易使用 set 來表示标記。

一個簡單的模組化方式是,對每一個希望标記的對象使用 set。這個 set 包含和對象相關聯的标簽的 ID。

假設我們想要給新聞打上标簽。 假設新聞 ID 1000 被打上了 1,2,5 和 77 四個标簽,我們可以使用一個 set 把 tag ID 和新聞條目關聯起來:

> sadd news:1000:tags 1 2 5 77
(integer) 4
           

但是,有時候我可能也會需要相反的關系:所有被打上相同标簽的新聞清單:

> sadd tag:1:news 1000
(integer) 1
> sadd tag:2:news 1000
(integer) 1
> sadd tag:5:news 1000
(integer) 1
> sadd tag:77:news 1000
(integer) 1
           

擷取一個對象的所有 tag 是很友善的:

> smembers news:1000:tags
1. 5
2. 1
3. 77
4. 2
           

注意:在這個例子中,我們假設你有另一個資料結構,比如一個 Redis hash,把标簽 ID 對應到标簽名稱。

使用 Redis 指令行,我們可以輕易實作其它一些有用的操作。比如,我們可能需要一個含有 1, 2, 10, 和 27 标簽的對象的清單。我們可以用 

SINTER

 指令來完成這件事。它擷取不同 set 的交集。我們可以用:

> sinter tag:1:news tag:2:news tag:10:news tag:27:news
... results here ...
           

不光可以取交集,還可以取并集,差集,擷取随機元素,等等。

擷取一個元素的指令是 

SPOP

,它很适合對特定問題模組化。比如,要實作一個基于 web 的撲克遊戲,你可能需要用 set 來表示一副牌。假設我們用一個字元的字首來表示不同花色:

>  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
           

現在,我們想要給每個玩家 5 張牌。

SPOP

 指令删除一個随機元素,把它傳回給用戶端,是以它是完全合适的操作。

但是,如果我們對我們的牌直接調用它,在下一盤我們就需要重新充滿這副牌。開始,我們可以複制 

deck

 鍵中的内容,并放入 

game:1:deck

 鍵中。

這是通過 

SUNIONSTORE

 實作的,它通常用于對多個集合取并集,并把結果存入另一個 set 中。但是,因為一個 set 的并集就是它本身,我可以這樣複制我的牌:

> sunionstore game:1:deck deck
(integer) 52
           

現在,我已經準備好給 1 号玩家發五張牌:

> 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"
           

One pair of jacks, not great…

Now it’s a good time to introduce the set command that provides the number of elements inside a set. This is often called the cardinality of a set in the context of set theory, so the Redis command is called 

SCARD

.

> scard game:1:deck
(integer) 47
           

The math works: 52 - 5 = 47.

When you need to just get random elements without removing them from the set, there is the 

SRANDMEMBER

 command suitable for the task. It also features the ability to return both repeating and non-repeating elements.

繼續閱讀