Redis集合(set)使用

集合简单说明

Redis的集合(set)允许用户将任意多个不相同的元素存储到集合中,这些元素既可以是文本数据也可以是二进制数据。前面说过列表也允许存储多个元素,但集合与列表有以下两点明显不同:

  • 列表可以存储重复元素,而集合只会存储非重复元素。尝试将一个已存在的元素添加到集合,将会被忽略
  • 二列表以有序方式存储元素而集合以无序方式存储元素

这两个差异带来的区别主要跟命令的复杂度有关系:

  • 在执行项linsert和lrem这样的列表命令时,即使命令只针对单个列表元素程序有时也不得不遍历整个列表已确定指定的元素是否存在,因此这些命令的复杂度都为O(N)
  • 对于集合来说,因为所有针对单个元素的集合命令都不须要遍历整个集合,所以命令复杂度都为O(1)

如下示例,展示一个名为database的集合,这个集合包含8个元素。

Redis为集合提供了一系列操作命令,通过这些命令,用户可以:

  • 将新元素添加到集合中,或者从集合中移除已有的元素
  • 将指定的元素从一个集合移动到另一个集合
  • 获取集合包含的所有元素
  • 获取集合包含的元素数量
  • 检查给定元素是否存在于集合中
  • 从集合中随机地获取指定数量的元素
  • 对多个集合执行交集、并集、差集计算

集合命令说明

sadd:将元素添加到集合

通过使用sadd命令,用户可以将一个或多个元素添加到集合中。

sadd key element  [element ...]

这个命令会返回成功添加的新元素,数量作为返回值。

下面通过示例展示sadd命令向集合db中添加元素的过程:

下面图示展示上述命令构建过程

使用sadd命令构建集合整个过程


因为集合不存储相同的元素,如果用户在使用sadd命令,向集合中添加元素的时候,命令会自动忽略,以存在的元素只将不存在于集合中的新元素,添加到集合中并返回添加成功的元素的数量。

例如,上述集合db中已经包含7个元素,当再次尝试将"Redis"、"MySql" 添加集合中的时候,命令返回添加成功的元素个数为0,表示没有任何元素添加到集合中

下面示例中,再次向集合中添加"Redis"、"MySql"、"Neo4j"元素。因为集合中不存在Neo4j元素,存在"Redis"、"MySql"两个元素,成功添加的元素个数为1。


srem:从集合中移除元素

通过使用srem命令用户,可以从集合中移除一个或多个已存在的元素。

srem key element [element ...]

命令会返回被移除的元素的数量

下面示例,展示srem命令的用法


如果用户给定的元素并不存在于集合当中,那么srem命令将忽略不存在的元素只移除那些确实存在的元素。

上图示例中,执行红色框线中的srem db "Neo4j" 命令时,因为前面已经通过srem命令移除了Neo4j元素,此时db集合中已经不存在Neo4j,移除元素个数为0。


smove:将元素从一个集合移动到另一个元素

smove命令允许用户将指定的元素从源集合移动到目标集合。

smove source-set target-set element

smove命令在移动操作成功执行时返回1,如果指定的元素并不存在于源集合,那么命令将返回0,并表示移动操作执行失败。如果目标集合target-set不存在时,会默认创建target-set集合。

下面示例,展示smove用法

上图中,两次smove命令分别将Redis和MongoDB两个元素从db集合中移动至nosql集合中。移动后效果图如下,db中不再有Redis和MongoDB两个元素,这两个元素存在于nosql集合中。

再次操作smove命令,将nosql中的元素向不存在的集合nosql2中移除。


如果用户想要移动的元素,并不存在于源集合和那么smove命令将放弃执行移动操作,并返回0表示移动操作执行失败。


即使用户想要移动的元素已经存在于目标集合,smove命令仍然会将指定的元素从源集合移动到目标集合并覆盖目标集合中的相同元素。从结果来看,这种移动不会改变目标集合包含的元素只会导致被移动的元素从源集合中消除。


smembers:获取集合包含的所有元素

smembers命令用户可以获取到集合包含的所有元素。

smembers set

前面示例中,已有使用smembers命令查看集合中所有元素的示例

因为Redis集合以无序的方式存储元素,并且smembers命令在获取集合元素时也不会对元素进行任何排序动作,所以根据元素添加顺序的不同,两个包含相同元素的集合,在执行smembers命令时的结果也可能有所不同。因此我们在使用smembers的命令操作集合的时候,不应该对集合元素的排列顺序做任何假设,如果需要我们可以在对客户可以在客户端对smembers的命令返回的元素进行排序,或者直接使用Redis提供的有序集合。


scard:获取集合包含的元素数量

通过使用scard命令,用户可以获取给定集合的大小,即集合包含的元素数量

scard set

下面代码示例,展示使用scard命令获取集合、集合的大小。


sismember:检查给定元素是否存在于集合中

通过使用sismember命令用户可以检查给定的元素是否存在于集合当中。

sismember set element

命令返回1表示给定的元素存在于集合当中;返回0表示给定的元素不存在于集合当中。使用sismember命令去检测已经存在于集合中的元素都将得到肯定的回答;使用sismember命令去检测,不存在于集合当中的元素,会得到否定的回答。

上图示例中,MySql存在于db集合中,使用sismember命令操作的时候会返回1;Mysql不存在,使用sismember命令检查db中是否存在Mysql时会返回0。


srandmember:随机获取集合中的元素

通过使用srandmember命令用户,可以从集合中随机的获取指定数量的元素。

srandmember set count

srandmember命令接受一个可选的count参数,用于指定用户想要获取的元素数量,如果用户没有给定这个参数,那么命srandmember令默认只获取一个元素。

需要注意的一点是,被srandmember命令返回的元素仍然会存在于集合当中,他们不会被移除,这一点可以通过查看集合包含的元素来确认。

上图示例,使用srandmember命令弹出3个元素,使用smembers命令可以查看db集合中的元素依然存在。

通过可选的count参数,用户可以指定命令返回的元素数量,其中count参数的值既可以是正数,也可以是负数。如果count参数值为正数,那么命令将返回count各不重复的元素。当count参数的值大于集合包含的元素数量时,命令将返回集合包含的所有元素。如果count参数的值为负数,那么命令将随机返回abs(count)个元素,并且这些元素当中允许出现重复的元素。

上图示例中,db中只有8个元素,在使用srandmember命令从db中弹出9个元素的时候,因为9大于db集合中元素总数量8,所以,会弹出db集合中所有元素。

上图示例中,count参数为-4,所以命令会返回4个元素,且有重复元素Redis。


spop:随机地从集合中移除指定数量的元素

通过使用spop命令用户,可以从集合中随机的移除指定数量的元素,spop命令接受一个可选的count参数,用于指定需要被移除的元素数量,如果用户没有给定这个参数,那么spop命令默认默认只移除一个元素。

spop set count

spop命令会返回被移除的元素,作为命令的返回值。

上图示例,使用spop命令操作db两次,两次弹出的元素均从db集合中移除了。

spop命令一次弹多个元素示例,因Windows系统Redis版本低,暂时无法演示了。

 spop命令和srandmember命令的主要区别在于:spop命令会移除被随机选中的元素;srandmember命令则不会移除被随机选中的元素。 spop命令和srandmember命令的另一个不同点在于spop命令只接受正数count值,如果向spop命令提供负数count的值将引发错误,因为负数count值对于spop命令是没有意义的。


sinter、sinterstore:对集合执行交集计算

sinter命令可以计算出用户给定的所有集合的交集,然后返回这个交集包含的所有元素。
sinter set1 set2 [set3 ...]

上面示例,对s1和s2做sinter运算,可以得到交集元素 d c a,对s1、s2和s3做sinter运算,可以得到交集运算d a。

除sinter命令之外,Redis还提供了sinterstore命令,这个命令可以把给定元素的交集计算结果存储到指定的集合键里面。
如果给定的键已经存在,那么sinterstore命令在执行存储操作之前会先删除已有的键。sinterstore命令在执行完毕之后,会有返回被存储的交集元素数量作为返回值。

sinterstore destination-set set1 set2 [set3 ...] 

上图示例,sinterstore s4 s1 s2 s3命令,对集合s1、s2和s3做交集操作,并将结果保存到集合s4中。


sunion、sunionstore:对集合执行并集计算

 sunion命令可以计算出用户给定的所有集合的并集,然后返回这个并集包含的所有元素。

sunion set1 set2 [set3 ...]

上图示例,集合s1、s2和s3,对s1和s2使用sunion命令做并集操作,得到5个不重复元素;对s1、s2和s3做并集操作,得到6个不重复元素。

与sinterstore命令类似,Redis也为sunion命令提供了对应的sunionstore命令,这个命令可以把给定集合的并集结果存储到指定的键中,并在键已经存在的情况下会自动覆盖已有的键。

sunionstore destination-set set1 set2 [set3 ...] 

上图示例,将并集结果保存到集合s4中。


sdiff、sdiffstore:对集合执行差集计算

sdiff命令可以计算出指定集合之间的差级并返回差级包含的所有元素。

sdiff set1 set2 [set3 ...]

上图示例,sdiff命令操作s1和s2集合,在集合s1中除去s2中有的元素,返回剩余元素。

sdiff命令会按照用户给定集合的顺序,从左到右依次的对给定的集合执行,差级计算。
与sinterstore命令和sunionstore命令一样,Redis为sdiff命令提供了相应的sdiffstore命令,这个命令可以把给定集合之间的差集计算结果存储到指定的键中,并且键已经存在的情况下自动覆盖已有的键。

sdiffstore destination-set set1 set2 [set3 ...] 

上图示例,将结果保存到集合s4中。

集合使用总结

1、集合允许用户存储任意多个各不相同的元素

2、在使用sadd命令向集合中添加元素时,已存在于集合中的元素会自动被忽略

3、集合以无序方式存储元素,两个包含相同元素的集合在使用smembers命令时可能会得到不同的结果

4、srandmember命令不会移除被随机选中的元素,spop命令会移除选中的元素

5、集合运算须要使用大量的计算资源,应该尽量存储并重用集合计算的结果。
 

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/113757140
今日推荐