Redis(04)Set类型--附有示例

Redis-Set类型

  • Redis-Set
    • SADD
    • SCARD
    • SDIFF
    • SDIFFSTORE
    • SINTER
    • SINTERCARD
    • SINTERSTORE
    • SISMEMBER
    • SMEMBERS
    • SMISMEMBER
    • SMOVE
    • SPOP
    • SRANDMEMBER
    • SREM
    • SSCAN
    • SUNION

Redis-Set

Redis中的Set类型表示的是无序、唯一的元素集合,它底层是通过哈希表(Hash Table)实现的。Redis Set类型的元素是不能重复的,因此可以使用集合类型来完成一些去重的需求。同时,Redis Set类型支持集合和元素的交集、并集等集合运算。

Redis Set类型的常用命令包括:

  • SADD:向集合中添加一个或多个元素;
  • SCARD:获取集合中元素的数量;
  • SPOP:随机移除集合中的一个或多个元素;
  • SMEMBERS:获取集合中所有的元素;
  • SDIFF:获取当前集合与其他一个或多个集合中不同的元素,即差集;
  • SINTER:获取当前集合与其他一个或多个集合中共同的元素,即交集;
  • SUNION:获取当前集合与其他一个或多个集合中所有的元素,即并集;
  • SISMEMBER:判断元素是否存在于集合中。

需要注意的是,在Redis中,集合类型的元素有一些限制,它只能是字符串类型的、二进制安全的并且大小不能超过512M。当然,这个大小对于普通应用来说已经足够大了。另外,在使用Redis Set类型时,可以通过Redis的事务(Transaction)和Lua脚本来确保一系列的操作是原子性的。

SADD

  1. SADD key member [member …]

将指定的member添加到key对应的集合中。如果member已经存在于集合中,则操作无效。返回值为添加到集合中的新成员数量。

假设我们有一个名为"fruits"的集合,我们要向其中添加苹果、香蕉和橙子三种元素,命令如下:

SADD fruits apple banana orange

执行上述命令后,如果集合中之前没有这三种元素,会返回3,表示三个元素都成功添加到了集合中。如果之前集合中已经有其中的一个或多个元素,返回值会是添加后集合中的新元素个数,也就是说重复的元素不会被重复添加。

如果你想要验证一下添加是否成功,可以使用SMEMBERS命令查看集合中的所有元素:

SMEMBERS fruits

执行上述命令后,会返回集合中所有的元素,输出类似如下结果:

1) "apple"
2) "banana"
3) "orange"

这就表示我们成功地把三种水果添加到了"fruits"集合中。

SCARD

  1. SCARD key

获取指定key对应集合的元素个数。

假设我们有一个名为"fruits"的集合,我们想要获取它包含的元素个数,命令如下:

SCARD fruits

执行上述命令后,会返回集合中的元素个数,输出类似如下结果:

(integer) 3

其中3就是集合中元素的个数。

需要注意的是,如果集合不存在,SCARD命令将返回0。如果你想要验证一下,可以尝试使用SMEMBERS命令查看一个不存在的集合,然后使用SCARD查看它的元素个数。

SDIFF

  1. SDIFF key [key …]

计算给定key集合与第一个key集合的差集,并返回结果集中的所有元素。注意:如果key不存在,它将被视为空集。

假设我们有两个集合,一个名为"fruits",包含苹果、香蕉和橙子三种元素,另一个名为"vegetables",包含西红柿、萝卜和黄瓜三种元素,我们想要查看这两个集合中不同的元素,也就是它们的差集,命令如下:

SDIFF fruits vegetables

执行上述命令后,会返回两个集合之间不同的元素,输出类似如下结果:

1) "apple"
2) "banana"
3) "orange"

这就表示在"fruits"集合中有苹果、香蕉和橙子三种元素,在"vegetables"集合中没有,所以它们就是这两个集合的差集。

需要注意的是,如果集合不存在或者被使用的集合中任何一个为空集,SDIFF命令将返回空集。如果你想要验证一下,可以尝试使用SPOP命令删除一个集合中的所有元素,然后再使用SDIFF查看它和其他集合之间的差集。

SDIFFSTORE

  1. SDIFFSTORE destination key [key …]

与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命令查看新集合中的元素。

SINTER

  1. SINTER key [key …]

计算给定key集合与第一个key集合的交集,并返回结果集中的所有元素。注意:如果key不存在,它将被视为空集。

SINTER命令用于获取多个集合的交集,下面是一个使用SINTER命令获取集合交集的例子:

假设我们有两个集合,一个名为"fruits",包含苹果、香蕉和橙子三种元素,另一个名为"red_fruits",包含苹果和橙子两种元素,我们想要查看这两个集合中共同拥有的元素,也就是它们的交集,命令如下:

SINTER fruits red_fruits

执行上述命令后,会返回这两个集合之间共同拥有的元素,输出类似如下结果:

1) "apple"
2) "orange"

这就表示在"fruits"集合和"red_fruits"集合中共同拥有的元素是苹果和橙子,它们就是这两个集合的交集。

需要注意的是,如果集合不存在或者被使用的集合中任何一个为空集,SINTER命令将返回空集。如果你想要验证一下,可以尝试使用SPOP命令删除一个集合中的所有元素,然后再使用SINTER查看它和其他集合之间的交集。

SINTERCARD

示例 一

  1. SINTERCARD key [key …]

与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,它们分别包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};
  • 集合B:{3, 4, 5, 6, 7};
  • 集合C:{5, 6, 7, 8, 9}。

我们可以使用SINTER命令获取这三个集合之间的交集元素,例如:

SINTER A B C

执行结果为:{5},因为集合A、B和C之间唯一的交集元素为5。

而如果我们想要获取这三个集合之间的交集元素数量,可以使用SINTERCARD命令,例如:

SINTERCARD A B C

执行结果为:1,因为集合A、B和C之间唯一的交集元素为5,所以交集元素数量为1。

SINTERSTORE

  1. SINTERSTORE destination key [key …]

与SINTER命令类似,但是将计算结果集存储在给定的destination集合中。如果destination集合已经存在,则覆盖原有的内容。返回值为存储在destination集合中的元素数量。

SINTERSTORE命令用于获取多个集合之间的交集,并将结果存储在一个新的集合中。其命令格式如下:

SINTERSTORE destination key [key ...]

其中,destination表示交集结果要存储的新集合名称,key表示要求交集的原始集合名称,可以输入多个key,即可求多个集合之间的交集。

例如,假设我们有两个集合A、B,它们分别包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};
  • 集合B:{3, 4, 5, 6, 7}。

我们可以使用SINTERSTORE命令获取这两个集合之间的交集,并将结果存储在一个名为"intersection"的新集合中,例如:

SINTERSTORE intersection A B

执行结果为:3。这是因为集合A和集合B之间的交集为{3, 4, 5},它们被存储在新集合"intersection"中。

需要注意的是,如果交集结果集合已经存在,那么SINTERSTORE命令将覆盖这个结果集合。如果这个结果集合不存在,则会新创建一个结果集合。

同时,还需要注意的是,如果任意一个原始集合为空集,那么结果集合也将为空集,即使存在其他非空集合。

SISMEMBER

  1. SISMEMBER key member

判断member是否存在于key对应的集合中。如果存在,则返回1,否则返回0。

SISMEMBER命令用于判断某个元素是否存在于某个集合中,其命令格式如下:

SISMEMBER key member

其中,key表示需要判断的集合名称,member表示需要判断是否存在的元素。

例如,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};

我们可以使用SISMEMBER命令判断元素1是否存在于集合A中,例如:

SISMEMBER A 1

执行结果为:1。这是因为元素1存在于集合A中,返回值为1表示存在。

如果要判断的元素不在集合中,那么返回值为0,表示不存在。

需要注意的是,SISMEMBER命令只适用于集合类型,如果对非集合数据类型执行SISMEMBER命令,则会返回错误提示。

SMEMBERS

  1. SMEMBERS key

SMEMBERS命令用于获取某个集合中的所有元素,其命令格式如下:

SMEMBERS key

其中,key表示需要获取元素的集合名称。

例如,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};

我们可以使用SMEMBERS命令获取集合A中的所有元素,例如:

SMEMBERS A

执行结果为:{1, 2, 3, 4, 5}。即返回一个包含集合A中所有元素的数组。

需要注意的是,如果集合为空集,那么SMEMBERS命令将返回一个空的数组。同时,如果对非集合数据类型执行SMEMBERS命令,则会返回错误提示。

SMISMEMBER

  1. SMISMEMBER key member [member …]

判断多个member是否存在于key对应的集合中。类似于SISMEMBER,但可以同时判断多个member。

该命令可以在给定的一个或多个集合Key的情况下,判断指定的一个元素是否在这些集合中。该命令的使用方法如下:

SMISMEMBER key member [member ...]

其中,key表示集合名称,member表示需要判断是否存在于集合中的元素。

如果member存在于key所对应的集合中,则返回1;如果member不存在于key所对应的集合中,则返回0。 如果key不存在,则返回0。

举个例子,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};

那么我们可以使用SMISMEMBER命令来判断某个元素是否在集合A中:

SMISMEMBER A 3

执行结果为:1。表示元素3在集合A中。如果判断的元素不在集合中,SMISMEMBER命令会返回0。比如:

SMISMEMBER A 6

执行结果为:0。表示元素6不在集合A中。

需要注意的是,如果请求的key并非集合类型,则Redis将返回错误提示。此外,在一次请求中可以同时传入多个member参数,如果传入多个,则会同时进行多次判断。

SMOVE

  1. SMOVE source destination member

将member从source集合移动到destination集合。如果member已经存在于destination集合中,则移动操作无效。返回值为移动操作是否成功(即源集合是否包含该成员)。

SMOVE命令用于将一个集合中的一个元素移动到另一个集合中,其使用方法如下:

SMOVE source destination member

其中,source表示要移动元素的源集合,destination表示要移动元素的目标集合,member表示将要移动的元素。

如果源集合source中存在元素member,则将member从source中移除,并将其加入到destination中。如果源集合source中不存在元素member,则不做任何修改。

举个例子,假设我们有两个名为A和B的集合,它们分别包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};
  • 集合B:{6, 7, 8, 9, 10}。

我们可以使用SMOVE命令将集合A中的元素3移动到集合B中:

SMOVE A B 3

执行后,集合A变成{1, 2, 4, 5},集合B变成{6, 7, 8, 9, 10, 3}。

需要注意的是,如果源集合和目标集合相同,那么SMOVE命令相当于将元素副本从原位置复制到新位置,因此源集合和目标集合仍然会存在该元素。此外,如果源集合或目标集合不存在,SMOVE命令会返回0。

SPOP

  1. SPOP key [count]

随机删除key对应的集合中的一个或多个元素,并返回被删除的元素。如果key不存在,会返回nil。可选参数count指定需要删除元素的数量。

SPOP命令用于随机从集合中获取一个元素并将其删除,其使用方法如下:

SPOP key [count]

其中,key表示源集合,count表示要获取元素的个数,如果不设置count,则默认取出一个元素。

执行后,命令会返回一个随机元素。如果集合为空,该命令会返回nil。

举个例子,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};

我们可以使用SPOP命令从集合A中随机获取1个元素:

SPOP A

执行后,集合A中将会少一个元素,同时返回随机获取的一个元素。

如果我们想要同时获取多个元素,则可以设置count参数,比如:

SPOP A 3

这个命令会从集合A中随机取出3个元素并返回。

需要注意的是,SPOP命令会从集合中将元素删除,因此返回的元素不会再出现在集合中。如果集合中没有足够的元素以供取出,则只会返回集合中存在的所有元素。

SRANDMEMBER

  1. SRANDMEMBER key [count]

随机获取key对应的集合中一个或多个元素,但不会将其从集合中删除。如果key不存在,会返回nil。可选参数count指定需要获取元素的数量。

SRANDMEMBER命令用于从集合中随机获取一个或多个元素,其使用方法如下:

SRANDMEMBER key [count]

其中,key表示源集合,count表示要获取元素的个数,如果不设置count,则默认取出一个元素。

执行后,命令会返回一个随机元素。如果集合为空,该命令会返回nil。

举个例子,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};

我们可以使用SRANDMEMBER命令从集合A中随机获取1个元素:

SRANDMEMBER A

执行后,集合A中元素不变,同时返回随机获取的一个元素。

如果我们想要同时获取多个元素,则可以设置count参数,比如:

SRANDMEMBER A 3

这个命令会从集合A中随机取出3个元素并返回。

需要注意的是,SRANDMEMBER命令不会将元素从集合中删除,因此同一个元素可能被随机获取多次。如果集合中没有足够的元素以供取出,则只会返回集合中存在的所有元素。

SREM

  1. SREM key member [member …]

从key对应的集合中删除指定的member。如果member不存在于集合中,则操作无效。返回值为从集合中移除的成员数量。

SREM命令用于从集合中移除一个或多个元素,其使用方法如下:

SREM key member [member ...]

其中,key表示要删除元素的集合,member表示要删除的元素,可以同时删除多个元素,以空格隔开。

执行后,命令会返回一个整型值,表示被成功移除的元素个数。如果元素不存在,则被视为移除成功,返回值为0。

举个例子,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};

我们可以使用SREM命令删除集合A中的元素2和元素4:

SREM A 2 4

执行后,集合A中将只剩下元素1、元素3和元素5,同时命令的返回值为2,表示成功删除了两个元素。

需要注意的是,如果传入的元素在集合中不存在,则被视为已经被成功移除。如果集合中不存在任何一个传入的元素,则返回值为0。

SSCAN

  1. SSCAN key cursor [MATCH pattern] [COUNT count]

为迭代集合指定一个游标位置,然后扫描key对应集合中指定数量的元素,并返回迭代的下一个游标位置。可选参数MATCH用于匹配指定模式的元素,COUNT用于限制迭代扫描的元素数量。返回值为迭代过程中扫描到的元素

SSCAN命令用于迭代遍历集合中的元素,其使用方法如下:

SSCAN key cursor [MATCH pattern] [COUNT count]

其中,key表示要遍历的集合,cursor表示起始的游标位置,MATCH表示匹配的模式,COUNT表示每次遍历的元素数量。

执行后,命令会返回一个数组,包含下一个游标位置和匹配元素的数组。如果不存在下一位游标位置,则返回的数组只有两个元素,分别为0和[]。

举个例子,假设我们有一个名为A的集合,它包含以下元素:

  • 集合A:{aaa, bbb, ccc, abc, abcd};

我们可以使用SSCAN命令遍历集合A中的所有元素:

SSCAN A 0

执行后,命令会返回一个数组,包含下一个游标位置和匹配元素的数组。

如果我们要查找集合A中匹配字符串“ab”的元素,则可以使用如下命令:

SSCAN A 0 MATCH ab*

执行后,集合A中匹配“ab”的元素的数组会返回。

需要注意的是,SSCAN命令是一个基于游标的迭代器,可以让我们逐步遍历整个集合。在遍历集合期间,如果集合内容被改变,则无法保证完整性和准确性。

SUNION

  1. SUNION key [key …]

计算给定key集合与第一个key集合的并集,并返回结果集中的所有元素。注意:如果key不存在,它将被视为空集。

SUNION命令用于获取多个集合的并集,并返回结果集合。其使用方法如下:

SUNION key [key ...]

其中,key表示要获取并集的集合,可以指定多个,以空格隔开。

执行后,命令会将指定的所有集合取并集,并返回一个结果集合,包含所有集合中的元素,且无重复元素。

举个例子,假设我们有两个名为A和B的集合,它们分别包含以下元素:

  • 集合A:{1, 2, 3, 4, 5};
  • 集合B:{4, 5, 6, 7, 8};

我们可以使用SUNION命令获取集合A和集合B的并集:

SUNION A B

执行后,命令会返回一个结果集合,包含所有集合A和集合B中的元素,且无重复元素,即:

  • {1, 2, 3, 4, 5, 6, 7, 8};

需要注意的是,如果其中某个集合不存在,则被视为是一个空集合,结果集合也将为空。

你可能感兴趣的:(Redis,redis,lua,数据库)