set类型,是什么类型?它是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。set元素最大可以包含(2的32次方-1)个元素。
set类型与list类型的对比:
list类型图形化理解为:
set类型图形化理解为:
①list类型按照添加顺序排序,set类型是无顺序的。
②list类型允许添加重复数据,set类型不允许有重复数据。
以上两点,大家只要想一想:list类型是双向链表实现的,set类型是哈希表实现的,这样就不难理解了。
set类型操作命令:
下面开始做演示:
有两个人:tom与linken,分别用两个set类型记录下两人的好友列表。tom好友set集合的key为tomfri,linken好友set集合的key为linkenfri。
①为集合添加数据元素
sadd tomfri mary jack xiaomi laowang sadd linkenfri john lucy mary xiaomi
sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
当集合 key 不是集合类型时,返回一个错误。
注意:在Redis2.4版本以前, SADD 只接受单个成员值。
②查看集合数据元素
scard tomfri //查看集合中元素的数量,不再是len了 smembers linkenfri //返回集合中的所有的成员。 不存在的集合 key 被视为空集合。 sismember linkenfri lucy //判断成员元素是否是集合的成员。如果成员元素是集合的成员,返回 1 。 如果成员元素不是集合的成员,或 key 不存在,返回 0 。
为linkenfri集合添加了Lucy,因为本来就存在,所以再次添加被忽略。
③移除集合数据元素
srem linkenfri lucy smove tomfri linkenfri jack
srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
当 key 不是集合类型,返回一个错误。
smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合。
smove 是原子性操作(Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行)。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
SPOP key_name 移除并返回集合中的一个随机元素
把集合看作一个班级,每个学生都有唯一的学号,spop命令类似于对全班同学的随机点名,每个同学只点一次。
④两组集合的关系
应该是我们初中学习数学时,有这样的知识,对两组及多组数字求出交集、并集和差集。一张图生动理解这三个概念:
Redis的set类型也有相关的一些命令可以求出多个集合之间的交集、并集与差集的关系。
1)交集
sinter tomfri linkenfri //返回给定所有给定集合的交集
sinterstore p1 tomfri linkenfri //把所有集合的交集存到新的集合中,p1是新的集合名称
2)并集
sunion tomfri linkenfri sunionstore p2 tomfri linkenfri
3)差集
sdiff tomfri linkenfri sdiff linkenfri tomfri
sdiff 命令返回给定集合之间的差集。不存在的集合 key 将视为空集。
注意的地方:差集的结果来自前面的 FIRST_KEY ,而不是后面的 OTHER_KEY1,也不是整个 FIRST_KEY OTHER_KEY1..OTHER_KEYN 的差集。
sdiffstore p3 tomfri linkenfri sdiffstore p3 linkenfri tomfri
set类型的应用
1)社交网站,通过计算两个集合(好友列表)的交集,可做出共同好友、互相关注功能;通过计算两个集合的差集,可做出好友推荐功能。
2)利用set的唯一性,可统计访问网站的所有独立ip。