Redis数据类型 - Sets

Redis Sets是字符串的无序集合。SADD命令向集合添加新元素。还可以对集合执行一些其他操作,比如检查给定的元素是否已经存在,取多个集合的交集、并集和差集,等等。

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"

这里,我向集合中添加了三个元素,并告诉Redis返回所有元素。
Redis有检查成员关系的命令。例如,检查一个元素是否存在:

127.0.0.1:6379> sismember myset 3
(integer) 1  #“3”是集合的成员
127.0.0.1:6379> sismember myset 30
(integer) 0  #“30”不是

Sets适合用于表示对象之间的关系。例如,我们可以很容易地使用集合来实现标记。
解决这个问题的一个简单模型是为我们想要标记的每个对象设置一个集合。该集合包含与对象关联的标记的id。
一个例子是给新闻文章加标签。如果article ID 1000被标记上标签1、2、5和77,用一个集合可以将这些标签ID与新闻关联起来:

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

我们可能还想要有反向关系:一个给定的标签所标记的所有新闻:

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

获取指定对象的所有标记很简单:

127.0.0.1:6379> smembers news:1000:tags
1) "1"
2) "2"
3) "5"
4) "77"

注意:在这个示例中,我们假设你有另一个数据结构,例如Redis Hashes,它将标记id映射到标记名称。

使用正确的Redis命令还可以轻松实现其他一些重要的操作。例如,我们可能需要一个包含所有标记1、2、10和27的对象的列表。我们可以使用SINTER命令来实现这一点,它获取不同集合之间的交集。我们可以使用:

127.0.0.1:6379> sinter tag:1:news tag:2:news tag:10:news tag:27:news

除了交集,还可以获取并集、差集、提取随机元素等等。

提取元素的命令是SPOP,对处理某些问题非常方便。例如,为了实现网络扑克游戏,您可能想要用一个集合表示您的牌组。假设我们使用一个字符前缀表示梅花(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

现在我们想为每个玩家提供5张牌。SPOP命令删除一个随机元素,并将其返回给客户端,因此在本例中这是一个完美的操作。

然而,如果我们直接对牌组调用SPOP,在下一局游戏中,我们需要再次创建牌组,这可能不太理想。我们可以在开局之前将存储在deck键中的集合复制到game:1:deck键中。
这是通过SUNIONSTORE实现的,它可以取多个集合之间的并集,并将结果存储到另一个集合中。然而,一个集合的并集就是它本身,可以用下面的方式复制一个集合:

127.0.0.1:6379> SUNIONSTORE game:1:deck deck
(integer) 52

现在我准备为第一个玩家提供五张牌:

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

这是引入另一个set命令的好时机,该命令提供了集合中元素的数量。通常在集合理论上下文中称为集合的基数,此Redis命令称为SCARD。

127.0.0.1:6379> scard game:1:deck
(integer) 47  #52-5=47

当您只需要获取随机元素而不从集合中删除它们时,有一个SRANDMEMBER命令适合于此任务。它还具有同时返回重复元素和非重复元素的功能。

你可能感兴趣的:(Redis数据类型 - Sets)