Redis Sets类型介绍

来源:互联网 发布:美帝良心想 知乎 编辑:程序博客网 时间:2024/06/18 05:41

Redis Sets类型介绍

Redis set是字符串的无序集合,使用SADD命令向set中添加一个新元素,也可以做大量对于set的其他操作如检查给定的元素是否已存或者执行多个set之间求交集、并集操作或者求多个set之间的不同等操作。

>sadd myset 1 2 3(integer) 3>smembers myset1) "3"2) "1"3) "2"

注:这里我已经向myset set中添加了3个元素,并且度Redis返回了所有元素。正如上面看到的那样,set中的元素是无序的。

Redis提供测试set成员关系的测试命令。如,测试一个元素是否存在:

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

注:3是set myset的成员,30不是。

set可以很好的表示对象间的关系。例如,我们可以很容易的用set来实现标签对象。

这个问题的一个简单模型就是用set记录我们想要标记的每一个对象,这个set集包含与要标记对象关联的标记ID。

一个实例就是标记新的文章。如果ID为1000的文章由1 ,2,5,77标记,可以将关联信息这样放入set:

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

我们可能也想要一个相反的映射关系,如:

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

获取给定对象的所有标签:

>smembers news:1000:tags1)"1"2)"2"3)"5"4)"77"

注:在上面的例子中,我们是假设你有别外的数据结构,如Redis hash,来映射标签ID与标签名称的。

还有一些其他非锁碎操作也可以通过使用正确的redis命令非常容易的实现。例如,我们可能会想要求取一个这样一个List,它所包含的对象都是由标签1 2 10 27一起标记的,那么我们就可以使用SINTER命令(求不同set集合间的交集)来简单实现:

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

除了求交集,你也可以求不同Set的并集,差集,或者获取set集合中的一个随机元素等等。

获取set中随机元素的命令是SPOP,用于解决某些问题的建模问题。例如,为了实现一个基于WEB的纸牌游戏,你可能想要用一个set集合来存放一套纸牌。假设用一个字符前缀表示第张纸牌的分类,C表示梅花,D表示方块,H表示红桃,S表示黑桃:

>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命令随机删除Set中的一个元素,并将删除的元素返回到客户端,所以这种情况下此命令操作完美胜任。

但是,如果我们直接在我们定义的deck套牌上调用,那么下一次游戏时我们将不得不再次填充套牌,这样可能并不是我们想要的。所以在开始的时候,我们可以从套牌deck中复制出来一份到game:1:deck。

这可以通过SUNIONSTORE【原型:sunionstore destination key[key…]】命令完成。这个命令是用于求多个set集合(对应命在原型参数中的一个或者多个key)的并集,并且将求得的结果存储在另一个集合(由destination指定)中。当然如果对一个set集合求并集那么就是他自己,此时相当于复制操作,所以我们可以这样复制set deck:

>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集合中元素个数的好时机。set集合中元素的个数在集合理论背景下被叫做一个集合的cardinality(基数),所以Redis对应些的命令就叫做SCARD:

>scard game:1:deck(integer) 47

注:数学计算:52-5 = 47。

当我们需要仅仅随机获取set集合中的一个元素而不需要删除集合中元素时,可以使用SRANDMEMBER命令,它可以返回不重复的元素也可以返回重复的元素。

0 0
原创粉丝点击