Set(集合)特点:无序、无重复元素
1、 插入一条set数据
redis 127.0.0.1:6379> sadd frieds:zhangsan "bingbing" "baby" "fengjie" "furong" "ruhua" "xiaxia"
(integer) 6
redis 127.0.0.1:6379> scard frieds:zhangsan #获取Set中成员的数量
(integer) 6
redis 127.0.0.1:6379>
2、获取一条set数据的所有members
redis 127.0.0.1:6379> smembers frieds:zhangsan
1) "fengjie"
2) "baby"
3) "furong"
4) "bingbing"
5) "feifei"
6) "ruhua"
3、判断一个成员是否属于某条指定的set数据(true为1,false为0)
redis 127.0.0.1:6379> sismember frieds:zhangsan "baby" #如果是,则返回1
(integer) 1
redis 127.0.0.1:6379> sismember frieds:zhangsan "liuyifei" #如果不是,则返回0
(integer) 0
4、求两个set数据的差集
(1)求差集,返回数据列表。
redis 127.0.0.1:6379> sdiff frieds:zhangsan friends:xiaotao
1) "furong"
2) "fengjie"
3) "ruhua"
4) "feifei"
(2)求差集,并将结果存入到另一个set集合"zhangsan-xiaotao"中,返回数值。
redis 127.0.0.1:6379> sdiffstore zhangsan-xiaotao frieds:zhangsan friends:xiaotao
(integer) 4
查看差集结果
redis 127.0.0.1:6379> smembers zhangsan-xiaotao
1) "furong"
2) "fengjie"
3) "ruhua"
4) "feifei"
5、 求交集
(1)求交集,返回数据列表。
redis 127.0.0.1:6379> sinter frieds:zhangsan friends:xiaotao
(2)求交集,存入另一set集合,返回数值。
redis 127.0.0.1:6379> sinterstore zhangsan^xiaotao frieds:zhangsan friends:xiaotao
查看交集结果
redis 127.0.0.1:6379> smembers zhangsan^xiaotao
6.、求并集,用法同上
(1)求并集,返回数据列表。
redis 127.0.0.1:6379> sunion frieds:zhangsan friends:xiaotao
(2)求并集,存入另一set集合,返回数值。
redis 127.0.0.1:6379> sunionstore zhangsan+xiaotao frieds:zhangsan friends:xiaotao
查看差集结果
redis 127.0.0.1:6379> smembers zhangsan+xiaotao
与list区别
redis中,set可看作为没有排序的字符集合,和list类型一样,是一个列表的功能,可以在该类型数值上执行添加、删除或判断某一元素是否存在等操作。但是与list不同的是:1、不会出现重复的数据,2、提供了可判断某个成员是否在一个set集合内的接口。3、在服务器端完成多个sets之间的聚合计算操作,如:unions、intersections。所以效率很快。
应用
1、在微博应用中,将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。由于redis还为集合提供了求交集、并集、叉集等操作,所以非常方便的实现如共同关注、共同喜欢、二度好友等功能;在购物方面应用:所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,若想获取有哪些客户同时购买了这两种商品时,Set的叉集命令就可以充分发挥它的方便和效率的优势了。
2、跟踪一些唯一性数据,如访问某一博客的唯一IP地址信息。对于此场景,仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
具体实现
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,也是set能提供判断一个成员是否在集合内的原因。