Redis中的Set类型表示的是无序、唯一的元素集合,它底层是通过哈希表(Hash Table)实现的。Redis Set类型的元素是不能重复的,因此可以使用集合类型来完成一些去重的需求。同时,Redis Set类型支持集合和元素的交集、并集等集合运算。
Redis Set类型的常用命令包括:
需要注意的是,在Redis中,集合类型的元素有一些限制,它只能是字符串类型的、二进制安全的并且大小不能超过512M。当然,这个大小对于普通应用来说已经足够大了。另外,在使用Redis Set类型时,可以通过Redis的事务(Transaction)和Lua脚本来确保一系列的操作是原子性的。
将指定的member添加到key对应的集合中。如果member已经存在于集合中,则操作无效。返回值为添加到集合中的新成员数量。
假设我们有一个名为"fruits"的集合,我们要向其中添加苹果、香蕉和橙子三种元素,命令如下:
SADD fruits apple banana orange
执行上述命令后,如果集合中之前没有这三种元素,会返回3,表示三个元素都成功添加到了集合中。如果之前集合中已经有其中的一个或多个元素,返回值会是添加后集合中的新元素个数,也就是说重复的元素不会被重复添加。
如果你想要验证一下添加是否成功,可以使用SMEMBERS命令查看集合中的所有元素:
SMEMBERS fruits
执行上述命令后,会返回集合中所有的元素,输出类似如下结果:
1) "apple"
2) "banana"
3) "orange"
这就表示我们成功地把三种水果添加到了"fruits"集合中。
获取指定key对应集合的元素个数。
假设我们有一个名为"fruits"的集合,我们想要获取它包含的元素个数,命令如下:
SCARD fruits
执行上述命令后,会返回集合中的元素个数,输出类似如下结果:
(integer) 3
其中3就是集合中元素的个数。
需要注意的是,如果集合不存在,SCARD命令将返回0。如果你想要验证一下,可以尝试使用SMEMBERS命令查看一个不存在的集合,然后使用SCARD查看它的元素个数。
计算给定key集合与第一个key集合的差集,并返回结果集中的所有元素。注意:如果key不存在,它将被视为空集。
假设我们有两个集合,一个名为"fruits",包含苹果、香蕉和橙子三种元素,另一个名为"vegetables",包含西红柿、萝卜和黄瓜三种元素,我们想要查看这两个集合中不同的元素,也就是它们的差集,命令如下:
SDIFF fruits vegetables
执行上述命令后,会返回两个集合之间不同的元素,输出类似如下结果:
1) "apple"
2) "banana"
3) "orange"
这就表示在"fruits"集合中有苹果、香蕉和橙子三种元素,在"vegetables"集合中没有,所以它们就是这两个集合的差集。
需要注意的是,如果集合不存在或者被使用的集合中任何一个为空集,SDIFF命令将返回空集。如果你想要验证一下,可以尝试使用SPOP命令删除一个集合中的所有元素,然后再使用SDIFF查看它和其他集合之间的差集。
与SDIFF命令类似,但是将计算结果集存储在给定的destination集合中。如果destination集合已经存在,则覆盖原有的内容。返回值为存储在destination集合中的元素数量。
下面是一个使用SDIFFSTORE求集合差集并保存到新集合的例子:
假设我们有两个集合,一个名为"fruits",包含苹果、香蕉和橙子三种元素,另一个名为"vegetables",包含西红柿、萝卜和黄瓜三种元素,我们想要查看这两个集合中不同的元素,并且将结果保存到一个新的集合中,命令如下:
SDIFFSTORE diff fruits vegetables new_diff_set
执行上述命令后,会返回保存到新集合中的元素个数,输出类似如下结果:
(integer) 3
这就表示在两个集合之间不同的元素有3个,分别是苹果、香蕉和橙子。这三个元素被保存到了名为"new_diff_set"的新集合中。
需要注意的是,成功执行SDIFFSTORE命令后,目标集合"new_diff_set"将覆盖原有的集合元素,如果集合不存在,则会自动创建该集合。如果你想要验证一下,可以尝试使用SMEMBERS命令查看新集合中的元素。
计算给定key集合与第一个key集合的交集,并返回结果集中的所有元素。注意:如果key不存在,它将被视为空集。
SINTER命令用于获取多个集合的交集,下面是一个使用SINTER命令获取集合交集的例子:
假设我们有两个集合,一个名为"fruits",包含苹果、香蕉和橙子三种元素,另一个名为"red_fruits",包含苹果和橙子两种元素,我们想要查看这两个集合中共同拥有的元素,也就是它们的交集,命令如下:
SINTER fruits red_fruits
执行上述命令后,会返回这两个集合之间共同拥有的元素,输出类似如下结果:
1) "apple"
2) "orange"
这就表示在"fruits"集合和"red_fruits"集合中共同拥有的元素是苹果和橙子,它们就是这两个集合的交集。
需要注意的是,如果集合不存在或者被使用的集合中任何一个为空集,SINTER命令将返回空集。如果你想要验证一下,可以尝试使用SPOP命令删除一个集合中的所有元素,然后再使用SINTER查看它和其他集合之间的交集。
示例 一
与SINTER命令类似,但是返回的是结果集中元素的数量。注意:如果key不存在,返回值为0。
SINTERCARD命令用于获取多个集合的交集元素数量,下面是一个使用SINTERCARD命令获取集合交集元素数量的例子:
假设我们有三个集合分别为"fruits"、“red_fruits"和"green_fruits”,分别包含苹果、橙子、香蕉、草莓、红葡萄和绿葡萄六种元素,我们想要查看这三个集合中共同拥有的元素数量,也就是它们的交集元素数量,命令如下:
SINTERCARD fruits red_fruits green_fruits
执行上述命令后,会返回这三个集合之间共同拥有的元素数量,输出类似如下结果:
(integer) 2
这就表示在这三个集合中共有两种水果:苹果和橙子,它们就是这三个集合的交集元素。
需要注意的是,如果集合不存在或者被使用的集合中任何一个为空集,SINTERCARD命令将返回0。如果你想要验证一下,可以尝试使用SPOP命令删除一个集合中的所有元素,然后再使用SINTERCARD查看它和其他集合之间的交集元素数量。
示例 二
SINTER命令用来获取多个集合之间的交集,而SINTERCARD命令则用来获取多个集合之间的交集元素数量。假设我们有三个集合A、B、C,它们分别包含以下元素:
我们可以使用SINTER命令获取这三个集合之间的交集元素,例如:
SINTER A B C
执行结果为:{5},因为集合A、B和C之间唯一的交集元素为5。
而如果我们想要获取这三个集合之间的交集元素数量,可以使用SINTERCARD命令,例如:
SINTERCARD A B C
执行结果为:1,因为集合A、B和C之间唯一的交集元素为5,所以交集元素数量为1。
与SINTER命令类似,但是将计算结果集存储在给定的destination集合中。如果destination集合已经存在,则覆盖原有的内容。返回值为存储在destination集合中的元素数量。
SINTERSTORE命令用于获取多个集合之间的交集,并将结果存储在一个新的集合中。其命令格式如下:
SINTERSTORE destination key [key ...]
其中,destination表示交集结果要存储的新集合名称,key表示要求交集的原始集合名称,可以输入多个key,即可求多个集合之间的交集。
例如,假设我们有两个集合A、B,它们分别包含以下元素:
我们可以使用SINTERSTORE命令获取这两个集合之间的交集,并将结果存储在一个名为"intersection"的新集合中,例如:
SINTERSTORE intersection A B
执行结果为:3。这是因为集合A和集合B之间的交集为{3, 4, 5},它们被存储在新集合"intersection"中。
需要注意的是,如果交集结果集合已经存在,那么SINTERSTORE命令将覆盖这个结果集合。如果这个结果集合不存在,则会新创建一个结果集合。
同时,还需要注意的是,如果任意一个原始集合为空集,那么结果集合也将为空集,即使存在其他非空集合。
判断member是否存在于key对应的集合中。如果存在,则返回1,否则返回0。
SISMEMBER命令用于判断某个元素是否存在于某个集合中,其命令格式如下:
SISMEMBER key member
其中,key表示需要判断的集合名称,member表示需要判断是否存在的元素。
例如,假设我们有一个名为A的集合,它包含以下元素:
我们可以使用SISMEMBER命令判断元素1是否存在于集合A中,例如:
SISMEMBER A 1
执行结果为:1。这是因为元素1存在于集合A中,返回值为1表示存在。
如果要判断的元素不在集合中,那么返回值为0,表示不存在。
需要注意的是,SISMEMBER命令只适用于集合类型,如果对非集合数据类型执行SISMEMBER命令,则会返回错误提示。
SMEMBERS命令用于获取某个集合中的所有元素,其命令格式如下:
SMEMBERS key
其中,key表示需要获取元素的集合名称。
例如,假设我们有一个名为A的集合,它包含以下元素:
我们可以使用SMEMBERS命令获取集合A中的所有元素,例如:
SMEMBERS A
执行结果为:{1, 2, 3, 4, 5}。即返回一个包含集合A中所有元素的数组。
需要注意的是,如果集合为空集,那么SMEMBERS命令将返回一个空的数组。同时,如果对非集合数据类型执行SMEMBERS命令,则会返回错误提示。
判断多个member是否存在于key对应的集合中。类似于SISMEMBER,但可以同时判断多个member。
该命令可以在给定的一个或多个集合Key的情况下,判断指定的一个元素是否在这些集合中。该命令的使用方法如下:
SMISMEMBER key member [member ...]
其中,key表示集合名称,member表示需要判断是否存在于集合中的元素。
如果member存在于key所对应的集合中,则返回1;如果member不存在于key所对应的集合中,则返回0。 如果key不存在,则返回0。
举个例子,假设我们有一个名为A的集合,它包含以下元素:
那么我们可以使用SMISMEMBER命令来判断某个元素是否在集合A中:
SMISMEMBER A 3
执行结果为:1。表示元素3在集合A中。如果判断的元素不在集合中,SMISMEMBER命令会返回0。比如:
SMISMEMBER A 6
执行结果为:0。表示元素6不在集合A中。
需要注意的是,如果请求的key并非集合类型,则Redis将返回错误提示。此外,在一次请求中可以同时传入多个member参数,如果传入多个,则会同时进行多次判断。
将member从source集合移动到destination集合。如果member已经存在于destination集合中,则移动操作无效。返回值为移动操作是否成功(即源集合是否包含该成员)。
SMOVE命令用于将一个集合中的一个元素移动到另一个集合中,其使用方法如下:
SMOVE source destination member
其中,source表示要移动元素的源集合,destination表示要移动元素的目标集合,member表示将要移动的元素。
如果源集合source中存在元素member,则将member从source中移除,并将其加入到destination中。如果源集合source中不存在元素member,则不做任何修改。
举个例子,假设我们有两个名为A和B的集合,它们分别包含以下元素:
我们可以使用SMOVE命令将集合A中的元素3移动到集合B中:
SMOVE A B 3
执行后,集合A变成{1, 2, 4, 5},集合B变成{6, 7, 8, 9, 10, 3}。
需要注意的是,如果源集合和目标集合相同,那么SMOVE命令相当于将元素副本从原位置复制到新位置,因此源集合和目标集合仍然会存在该元素。此外,如果源集合或目标集合不存在,SMOVE命令会返回0。
随机删除key对应的集合中的一个或多个元素,并返回被删除的元素。如果key不存在,会返回nil。可选参数count指定需要删除元素的数量。
SPOP命令用于随机从集合中获取一个元素并将其删除,其使用方法如下:
SPOP key [count]
其中,key表示源集合,count表示要获取元素的个数,如果不设置count,则默认取出一个元素。
执行后,命令会返回一个随机元素。如果集合为空,该命令会返回nil。
举个例子,假设我们有一个名为A的集合,它包含以下元素:
我们可以使用SPOP命令从集合A中随机获取1个元素:
SPOP A
执行后,集合A中将会少一个元素,同时返回随机获取的一个元素。
如果我们想要同时获取多个元素,则可以设置count参数,比如:
SPOP A 3
这个命令会从集合A中随机取出3个元素并返回。
需要注意的是,SPOP命令会从集合中将元素删除,因此返回的元素不会再出现在集合中。如果集合中没有足够的元素以供取出,则只会返回集合中存在的所有元素。
随机获取key对应的集合中一个或多个元素,但不会将其从集合中删除。如果key不存在,会返回nil。可选参数count指定需要获取元素的数量。
SRANDMEMBER命令用于从集合中随机获取一个或多个元素,其使用方法如下:
SRANDMEMBER key [count]
其中,key表示源集合,count表示要获取元素的个数,如果不设置count,则默认取出一个元素。
执行后,命令会返回一个随机元素。如果集合为空,该命令会返回nil。
举个例子,假设我们有一个名为A的集合,它包含以下元素:
我们可以使用SRANDMEMBER命令从集合A中随机获取1个元素:
SRANDMEMBER A
执行后,集合A中元素不变,同时返回随机获取的一个元素。
如果我们想要同时获取多个元素,则可以设置count参数,比如:
SRANDMEMBER A 3
这个命令会从集合A中随机取出3个元素并返回。
需要注意的是,SRANDMEMBER命令不会将元素从集合中删除,因此同一个元素可能被随机获取多次。如果集合中没有足够的元素以供取出,则只会返回集合中存在的所有元素。
从key对应的集合中删除指定的member。如果member不存在于集合中,则操作无效。返回值为从集合中移除的成员数量。
SREM命令用于从集合中移除一个或多个元素,其使用方法如下:
SREM key member [member ...]
其中,key表示要删除元素的集合,member表示要删除的元素,可以同时删除多个元素,以空格隔开。
执行后,命令会返回一个整型值,表示被成功移除的元素个数。如果元素不存在,则被视为移除成功,返回值为0。
举个例子,假设我们有一个名为A的集合,它包含以下元素:
我们可以使用SREM命令删除集合A中的元素2和元素4:
SREM A 2 4
执行后,集合A中将只剩下元素1、元素3和元素5,同时命令的返回值为2,表示成功删除了两个元素。
需要注意的是,如果传入的元素在集合中不存在,则被视为已经被成功移除。如果集合中不存在任何一个传入的元素,则返回值为0。
为迭代集合指定一个游标位置,然后扫描key对应集合中指定数量的元素,并返回迭代的下一个游标位置。可选参数MATCH用于匹配指定模式的元素,COUNT用于限制迭代扫描的元素数量。返回值为迭代过程中扫描到的元素
SSCAN命令用于迭代遍历集合中的元素,其使用方法如下:
SSCAN key cursor [MATCH pattern] [COUNT count]
其中,key表示要遍历的集合,cursor表示起始的游标位置,MATCH表示匹配的模式,COUNT表示每次遍历的元素数量。
执行后,命令会返回一个数组,包含下一个游标位置和匹配元素的数组。如果不存在下一位游标位置,则返回的数组只有两个元素,分别为0和[]。
举个例子,假设我们有一个名为A的集合,它包含以下元素:
我们可以使用SSCAN命令遍历集合A中的所有元素:
SSCAN A 0
执行后,命令会返回一个数组,包含下一个游标位置和匹配元素的数组。
如果我们要查找集合A中匹配字符串“ab”的元素,则可以使用如下命令:
SSCAN A 0 MATCH ab*
执行后,集合A中匹配“ab”的元素的数组会返回。
需要注意的是,SSCAN命令是一个基于游标的迭代器,可以让我们逐步遍历整个集合。在遍历集合期间,如果集合内容被改变,则无法保证完整性和准确性。
计算给定key集合与第一个key集合的并集,并返回结果集中的所有元素。注意:如果key不存在,它将被视为空集。
SUNION命令用于获取多个集合的并集,并返回结果集合。其使用方法如下:
SUNION key [key ...]
其中,key表示要获取并集的集合,可以指定多个,以空格隔开。
执行后,命令会将指定的所有集合取并集,并返回一个结果集合,包含所有集合中的元素,且无重复元素。
举个例子,假设我们有两个名为A和B的集合,它们分别包含以下元素:
我们可以使用SUNION命令获取集合A和集合B的并集:
SUNION A B
执行后,命令会返回一个结果集合,包含所有集合A和集合B中的元素,且无重复元素,即:
需要注意的是,如果其中某个集合不存在,则被视为是一个空集合,结果集合也将为空。