看到set,我们对他的第一反应应该是无序、去重,依照惯例,通过帮助文档学习其常用命令:
向set中添加元素:
SADD key member [member …]
summary: Add one or more members to a set
取出(查看)set中元素:
SMEMBERS key
summary: Get all the members in a set
删除元素:
SREM key member [member …]
summary: Remove one or more members from a set
获取set中元素的个数:
同时,针对集合我们有一些集合相关的操作交集、并集、差集,redis对这些操作也做了支持:
准备两个集合数据 k1 1 2 3 4 a b c d
k2 a b c d 5 6 7 8
求两个或多个集合的交集:SINTER key [key …]
summary: Intersect multiple sets
求并集:
SUNION key [key …]
summary: Add multiple sets
求差集:
注意:求差集的时候我们看到差集的结果和key的顺序是有关系的,k1在前面返回的是集合k1中存在但集合k2中不存在的元素,响应的k2在前面返回的是集合k2中存在但集合k1中不存在的元素。
另外我们发现,求并交差集的命名还有一个与之对应的命令后面添加了store,顾名思义,使用这种命令的时候,求出的结果并不直接返回而是会存储到我们指定的集合中。
接下来我们看一个set中比较好玩的命令:
SRANDMEMBER key [count]
summary: Get one or multiple random members from a set 从一个集合中随机获取一个或多个元素
看到这个命令的解释,我们第一反应应该是抽奖,对,使用这个命令可以很好地用到我们的抽奖活动中。
准备数据 k1 zhangsan lisi wangwu zhaoliu qianqi sunba
通过上面的记住操作我们可以对SRANDMEMBER命令总结出以下规律:
- 当count位置参数为正数且小于集合中元素个数时,随机返回集合中指定个数的元素,且没有重复元素。
- 当count位置参数为正数且大于等于集合中元素个数时,返回集合中的所有元素。
- 当count位置参数为负数且(绝对值)小于集合中元素个数时,随机返回集合中指定个数的元素,且可能有重复元素。
- 当count位置参数为负数且(绝对值)大于集合中元素个数时,随机返回集合中指定个数(绝对值)的元素,有重复元素。
- 当count位置参数为0时,不返回元素。
针对set中SRANDMEMBER命令的特点我们可以很好满足以下需求:
例如有 3个奖品,有zhangsan lisi wangwu zhaoliu qianqi sunba 6个人参与抽奖,
要求随机抽奖,同一个人不能重复中奖,则可以使用以下命令
SRANDMEMBER k1 3
要求随机抽奖,同一个人允许重复中奖,则可以使用以下命令
SRANDMEMBER k1 -3
假如现在有20个奖品,还是他们6人参与抽奖,则可以使用如下命令:
SRANDMEMBER k1 -20
针对上面这个命令,我们已经满足了部分抽奖需求,但实际工作中我们可能还会遇到另外一种情形,即每个人只参与一次抽奖,抽中后不再参与后面的抽奖,针对这种场景,redis也为我们提供了一个命令可以很好的满足这种情况:
SPOP key [count]
summary: Remove and return one or multiple random members from a set
好了,针对set的常用命令就介绍到这了,这个命令还是有蛮多适用场景的,有遇到合适场景的小伙伴就可以用起来了。