数据库 二月 23, 2020

Redis 集合(Set)命令

Words count 5k Reading time 5 mins. Read count 1000000

Redis 集合(Set)命令

前言

通过对Redis中集合(Set)命令的概览,发现集合命令本身并没有太大的难点。其主要还是对于数学集合的一些操作,相对于List类型来说,还是简单许多的。集合和列表的区别在于,集合是没有顺序的,同时,集合中也不存在相同的元素,即同一个元素在集合中只能出现一次。

初级命令

SAdd

从命令的命名中,我们就可以了解到,这儿命令是向集合中添加元素,其是Set Add的缩写。其命令为:SAdd key value1 …valueN是对集合的操作。这个命令不仅仅可以向集合中添加一个元素,而且可以添加多个元素。但是请注意,由于集合的特性,当你向集合中添加相同的元素或者集合中以及存在要添加的元素,这个元素将被忽略。该命令的返回值为:成功添加的元素数量。

既然集合是没有顺序的,那么集合中自然就不存在像列表中的那些在尾部插入首部插入索引插入这样的命令,只需要一个插入命令即可。当然,当我们知道了如何向集合中插入命令,我们就需要知道如何查询集合中具体元素和元素个数的命令,在这个时候,我们就需要使用这样的两个命令了:

  • SCard:查询集合中元素的数量
  • SMembers:查询聚合中含有那些具体元素

SCard

这个命令是Set Card的缩写,是用来查询集合中元素的数量的。其用法很简单:SCard key,是对集合的操作。这个命令返回元素中包含多少个元素的个数,但集合不存在的时候,返回值为0

SMembers

这个命令是Set Membersd 缩写。顾名思义,是用来查询集合中具体的元素的,是对集合的操作。其用法和SCard同样简单:SMembers key。返回集合中具体的元素。

SRem

这个命令是Set Remove的缩写。就是从集合中移除指定的一个或者多个元素。是对集合的操作。其命令和SAdd同样简单:SRem key value1 … valueN。集合中不存在的元素将会被忽略。返回值为成功删除的个数。

升级命令

我们已经接触到了Redis中对集合的简单的命令。但我们并没有涉及到集合的命令,因为Redis并没有为我们提供这样的命令。为什么呢?因为在集合中,我们并不需要精确的去查找某个元素,如果我们需要使用集合中的某个精确的元素,那我们为什么还有去在集合中查找呢?直接使用不就好了吗?如果我们需要确认集合中是否有这个元素,或者我们需要随机的访问集合中的某个或者某几个元素,Redis还是为我们提供了相关的命令的。那就让我们来看看吧!

SIsMember

确定某个元素是否属于集合或者说是在集合中是否存在指定的元素。其命令为:SIsMember key value。当元素存在的时候,返回1。不存在返回0。这样,当我们需要使用集合中某个精确的元素的时候,我们就可以先使用SIsMember来确定是否存在于集合中,如果存在,直接使用,不存在则可以先SAdd然后使用。

那么我们怎么使用集合中已经存在的随机某个或者某几个元素呢?这个时候,我们就需要使用SRandMember命令了。

SRandMember

这个命令用于从集合中随机选取某个或者某些个已经存在的元素,并返回。其命令是:SRandMember key [count]。在这里,参数count是可选的。参数count分一下集中情况:

  • 省略。从集合中随机返回一个元素
  • 正值。从集合中随机返回count个元素,并且元素不重复。当但count的值大于集合的大小的时候,会将整个集合返回。
  • 负值。从集合中随机返货count个元素,但元素可能重复。

Redis的这个SRandMember的命令,为我们提供了可以从原来集合中随机访问不含重复元素的方法,也提供了随机访问含重复元素的方法。

SRandMemberd相似的一个命令是SPop

SPop

Redis的SPop命令用于移除并返回集合中的一个元素。它和命令SRandMember的相同之处是都是随机访问。不同之处如下:

​ SPop:

+ 对集合有操作,会在集合中删除返回的元素
    + 一次只能返回一个元素

SRandMember:

  • 不影响原集合的元素
  • 一次可以返回多个值

SMove

SMove命令是将一个元素从source移动到destation中。如果destation中已经存在该元素,则该元素将被忽略。但此时该元素已经从source中删除。其命令为:SMove source dest value。如果value不存在于source,则返回0。不执行操作。

SScan

这个命令用于迭代集合中的元素,其命令为:SScan key cursor [Match pattern] [Count count]。其中的pattern用于模式匹配,如果包含这个参数,则只迭代符合模式的元素。如果指定count,则最多返回count个元素。

集合的其它操作

我们都知道,集合有交集,合集(又叫并集),差集。那么Redis中的集合是否也支持这中操作呢?答案是肯定的。其对应的方法分别是SInter,SUionSDiff。其对应的含有的存储命令为SInterStore,SUionStoreSDiffStore。这个几个命令的用法都是大同小异,所以,我这里只以SUionSUionStore为例,来介绍一下其用法。

SUion

求多个集合的合集。其命令为:SUion key1 … keyN。返回合集成员的列表。

SUionStore

求多个集合的合集,并将结果存储在一下新的集合例。其命令为:SUion destation key1 … keyN。返回集合中元素的数量,而这几个集合的合集已经存储到了destation中。

SInter,SDiff,SInterStore,SDiffStore

这四个命令的用法和SUionSUionStore是相似的,在此不再赘述。

总结

通过概览,我们知道Redis中集合的命令是不复杂的,只要我们在使用的过程中明确自己的需求和目的,这些命令已经可以满足我们平时对于集合的操作。更多的总结和坑还需要我们在实践中慢慢去体会,慢慢成长。

文章中有什么瑕疵和需要改进的地方,希望大家之处改正。

0%