Redis数据类型-Set

本文记录Redis学习过程中遇到的Redis数据类型-Set~

在Redis中,我们可以将Set类型看作为没有排序的字符集合。和List类型一样,我们也可以在该类型的数值上执行增加、删除或者判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为0(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。

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

常用命令:

  • sadd key values[value1 value2...]:向set中添加数据,如果该key的值已有则不会重复添加;
  • srem key members[member1 member2...]:删除set中指定的成员;
  • smembers key:获取set中所有的成员;
  • sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key不存在(无论集合中有多少元素都可以极速的返回结果);
  • sdiff key1 key2:返回key1与key2中相差的成员,而且与key的顺序有关,即返回差集。
  • sinter key1 key2...:返回交集;
  • sunion key1 key2...:返回并集;
  • scard key:获取set中成员的数量;
  • srandmember key:随机返回set中的一个成员;
  • sdiffstore destination key1 key2:将key1和key2相差的成员存储在destination上;
  • sinterstore destination key1 key2...:将返回的交集存储在destination上;
  • sunionstore destination key1 key2...:将返回的并集存储在destination上。

示例代码:

sadd myset a b c
sadd myset a
srem myset a
srem myset a b c
smembers myset
sismember myset a
sadd myset1 a b c
sadd myset2 a b d
sdiff myset1 myset2
sinter myset1 myset2
sunion myset1 myset2
scard myset

常见的使用场景:

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

标签: none