40

Redis集合类型使用说明

 4 years ago
source link: https://www.tuicool.com/articles/IbeAJje
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天我们了解一下Redis中的集合类型,也就是set集合。在Redis中set也是可以保存多个字符串的。那么set集合和list链表到底有什么不同呢?下面我们重点介绍一下它们之间的不同。

  • set中的元素是不可以重复的,而list是可以保存重复元素的。
  • set中的元素是无序的,而list中的元素是有序的。
  • set中的元素不能通过索引下标获取元素,而list中的元素则可以通过索引下标获取元素。
  • 除此之外set还支持更高级的功能,例如多个set取交集、并集、差集、等等。

下面我们介绍一下set中的相关命令。

BVJBZfZ.jpg!web

命令

一、集合内操作

1.添加元素

sadd key member [member ...] 
UBRj2mZ.jpg!web

sadd命令也是有返回值的,它的返回值就是当前执行sadd命令成功添加元素的个数,因为set中不能保存重复元素,所以在执行:

sadd setkey c d 

命令时,返回的是1,而不是2。因为元素c,已经成功保存到set中,不在继续保存了,只能将d保存到set中。

2.删除元素

srem key member [member ...] 
MNrUvem.jpg!web

srem命令和sadd命令一样也是有返回值的,返回值就是当前删除元素的个数。

3.计算元素个数

scard key 
iaIbYbq.jpg!web

scard命令的时间复杂度为O(1),scard命令不会遍历set中的所有元素,而是直接使用Redis中的内部变量。

4.判读元素是否在集合中

sismember key member 
ZnMZRfj.jpg!web

sismember命令也有返回值,如果返回值为1则表示当前元素在当前set中,如果返回0则表示当前元素不在set中。

5.随机从set中返回指定个数元素

srandmember key [ count] 
b2aUrqN.jpg!web

srandmember命令中有一个可选参数count,count参数指的是返回元素的个数,如果当前set中的元素个数小于count,则srandmember命令返回当前set中的所有元素,如果count参数等于0,则不返回任何数据,如果count参数小于0,则随机返回当前count个数的元素,不管当前set中的元素个数为多少。

6.从集合中随机弹出元素

spop key [ count] 

FFvaYbE.jpg!web

spop命令也是随机从set中弹出元素,并且也支持count可选参数,但有一点和srandmember命令不同。spop命令在随机弹出元素之后,会将弹出的元素从set中删除,而srandmember命令则不同,只会随机弹出元素,并不会将元素从set中删除。

7.获取所有元素

smembers key 
YJ7juev.jpg!web

smembers命令虽然能获取当前set中所有的元素,但smembers命令返回元素的顺序与sadd添加元素的顺序不一定相同,这也就是前面提到过的保存在set中的元素是无序的。

二、集合间操作

1.集合的交集

sinter key [ key ...] 
6reEjmV.jpg!web

2.集合的并集

sunion key [ key ...] 
Ijeame6.jpg!web

3.集合的差集

sdiff key [ key ...] 
Bb2Ufym.jpg!web

4.将集合的交集、并集、差集的结果保存

sinterstore destination key [ key ...] 
sunionstore destination key [ key ...] 
sdiffstore destination key [ key ...] 
VJrmY3m.jpg!web

为什么Redis要提供了sinterstore、sunionstore、sdiffstore命令来将集合的交集、并集、差集的结果保存起来呢?这是因为Redis在进行上述比较时,会比较耗费时间,所以为了提高性能可以将交集、并集、差集的结果提前保存时来,这样在需要使用时,可以直接通过smembers命令获取。

下面我们看一下set中相关命令的时间复杂度。

2636jyy.jpg!web

内部编码

  • intset(整数集合):当集合中的元素都是整数,并且集合中的元素个数小于512个时,Redis会选用intset作为底层内部实现。
  • hashtable(哈希表):当条件不满足上述时,Redis会采用hashtable作为底层实现。

备注:我们可以通过set-max-intset-entries参数来设置上述中的默认参数。

下面我们看一下具体的事例,来验证我们上面提到的内部编码。

JnqiIbm.jpg!web

1.当元素个数较少并且都是整数时,内部编码为intset。

BJf6Bf6.jpg!web

2.当元素不全是整数时,内部编码为hashtable。

3.当元素个数超过512个时,内部编码为hashtable。

iUbYniy.jpg!web
n2a6fya.jpg!web

上述命令就是Redis中的集合相关的知识,如有不正确的地方欢迎指出,谢谢。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK