概述

在Redis中,我们可以将set类型看作为没有排序的字符集合,和list类型的存储结构几乎一样,如下图所示。

redis set最大值 redis set最大数据量_IP


和list类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。set可包含的最大元素数量是4294967295

和list类型不同的是,set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,那么set中将仅保留该元素的一份拷贝。和list类型相比,set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

常用命令

添加/删除元素

sadd key values[value1 value2 ···]

向set中添加数据,若该key的值已有则不会重复添加。

redis set最大值 redis set最大数据量_Redis_02

srem key members[members1 members2 ···]

删除set中指定的成员。例如,

redis set最大值 redis set最大数据量_并集_03

获得集合中的元素

smembers key

获取set中所有的成员。例如,

redis set最大值 redis set最大数据量_IP_04

sismember key member

判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在(无论集合中有多少元素都可以极速的返回结果)。

redis set最大值 redis set最大数据量_Redis_05

集合的差集运算(A-B)

sdiff key1 key2 ···

返回key1与key2中相差的成员,而且与key的顺序有关。你还记得初中数学学过的集合之间的运算吗?想必你都懂。其实说白了执行该命令之后返回的是差集,如下图所示。

redis set最大值 redis set最大数据量_IP_06


知道了该命令执行之后返回的是什么之后,我们来尝试着用一下该命令,如下图所示。

redis set最大值 redis set最大数据量_Redis_07

集合的交集运算(A∩B)

sinter key1 key2 ···

执行该命令之后返回的是交集,如下图所示。

redis set最大值 redis set最大数据量_redis set最大值_08


知道了该命令执行之后返回的是什么之后,我们来尝试着用一下该命令,如下图所示。

redis set最大值 redis set最大数据量_并集_09

集合的并集运算(A∪B)

sunion key1 key2 ···

执行该命令之后返回的是并集,如下图所示。

redis set最大值 redis set最大数据量_并集_10


知道了该命令执行之后返回的是什么之后,我们来尝试着用一下该命令,如下图所示。

redis set最大值 redis set最大数据量_IP_11

其他

scard key

获取set中成员的数量。例如,

redis set最大值 redis set最大数据量_并集_12

srandmember key

随机返回set中的一个成员。例如,

redis set最大值 redis set最大数据量_redis set最大值_13

sdiffstore destination key1 key2 ···

将key1、key2相差的成员存储在destination上。例如,

redis set最大值 redis set最大数据量_redis set最大值_14

sinterstore destination key1 key2 ···

将返回的交集存储在destination上。例如,

redis set最大值 redis set最大数据量_IP_15

sunionstore destination key1 key2 ···

将返回的并集存储在destination上。例如,

redis set最大值 redis set最大数据量_并集_16

使用场景

这里我会讲两个使用场景,它们分别是:

  1. 可以使用Redis的set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中即可,set数据类型会自动保证IP地址的唯一性;
  2. 充分利用set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的set中,而购买另外一种电子产品的客户ID被存储在另外一个set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,set的intersections命令就可以充分发挥它的方便和效率的优势了。