看到set,我们对他的第一反应应该是无序、去重,依照惯例,通过帮助文档学习其常用命令:

Redis redis 集合类型 redis 集合 并集_redis


向set中添加元素:

SADD key member [member …]

summary: Add one or more members to a set

Redis redis 集合类型 redis 集合 并集_并集_02


取出(查看)set中元素:

SMEMBERS key

summary: Get all the members in a set

Redis redis 集合类型 redis 集合 并集_redis_03


删除元素:

SREM key member [member …]

summary: Remove one or more members from a set

Redis redis 集合类型 redis 集合 并集_并集_04


获取set中元素的个数:

Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_05


同时,针对集合我们有一些集合相关的操作交集、并集、差集,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

Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_06


求并集:

SUNION key [key …]

summary: Add multiple sets

Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_07


求差集:

Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_08


注意:求差集的时候我们看到差集的结果和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

Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_09


Redis redis 集合类型 redis 集合 并集_并集_10


Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_11


Redis redis 集合类型 redis 集合 并集_Redis redis 集合类型_12


Redis redis 集合类型 redis 集合 并集_重复元素_13


通过上面的记住操作我们可以对SRANDMEMBER命令总结出以下规律:

  1. 当count位置参数为正数且小于集合中元素个数时,随机返回集合中指定个数的元素,且没有重复元素。
  2. 当count位置参数为正数且大于等于集合中元素个数时,返回集合中的所有元素。
  3. 当count位置参数为负数且(绝对值)小于集合中元素个数时,随机返回集合中指定个数的元素,且可能有重复元素。
  4. 当count位置参数为负数且(绝对值)大于集合中元素个数时,随机返回集合中指定个数(绝对值)的元素,有重复元素。
  5. 当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

Redis redis 集合类型 redis 集合 并集_重复元素_14


好了,针对set的常用命令就介绍到这了,这个命令还是有蛮多适用场景的,有遇到合适场景的小伙伴就可以用起来了。