简介

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变

常用命令

sadd <key><value1><value2> ..... 将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
smembers <key>取出该集合的所有值。
sismember <key><value>判断集合<key>是否为含有该<value>值,有1,没有0
scard<key>返回该集合的元素个数。
srem <key><value1><value2> .... 删除集合中的某个元素。
spop <key>随机从该集合中吐出一个值。
srandmember <key><n>随机从该集合中取出n个值。不会从集合中删除 。
smove <source><destination>value把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2>返回两个集合的交集元素。
sunion <key1><key2>返回两个集合的并集元素。
sdiff <key1><key2>返回两个集合的差集元素(key1中的,不包含key2中的)

命令举例

127.0.0.1:6379> sadd myset hello # set集合中添加匀速
(integer) 1
127.0.0.1:6379> sadd myset zhubayi
(integer) 1
127.0.0.1:6379> sadd myset hahaha
(integer) 1
127.0.0.1:6379> smembers myset # 查看指定set的所有值
1) "hello"
2) "hahaha"
3) "zhubayi"
127.0.0.1:6379> sismember myset hello # 判断某一个值是不是在set集合中!
(integer) 1
127.0.0.1:6379> sismember myset java
(integer) 0
127.0.0.1:6379> scard myset # 获取set集合中的内容元素个数!
(integer) 3
127.0.0.1:6379>

rem

127.0.0.1:6379> srem myset hello # 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset #查看个数
(integer) 2
127.0.0.1:6379> smembers myset
1) "zhuabyi"
2) "hahaha"
127.0.0.1:6379>

set 无序不重复集合。抽随机!

127.0.0.1:6379> smembers myset #查看所有元素
1) "aaa"
2) "zhuabyi"
3) "hahaha"
127.0.0.1:6379> srandmember myset #随机取出一个元素
"hahaha"
127.0.0.1:6379> srandmember myset #随机取出一个元素
"hahaha"
127.0.0.1:6379> srandmember myset
"hahaha"
127.0.0.1:6379> srandmember myset
"hahaha"
127.0.0.1:6379> srandmember myset
"hahaha"
127.0.0.1:6379> srandmember myset
"aaa"
127.0.0.1:6379> srandmember myset
"zhuabyi"
127.0.0.1:6379> srandmember myset
"hahaha"
127.0.0.1:6379> srandmember myset 2 # 随机抽选出指定个数的元素
1) "zhuabyi"
2) "hahaha"
127.0.0.1:6379> srandmember myset 2 # 随机抽选出指定个数的元素
1) "zhuabyi"
2) "aaa"
127.0.0.1:6379>

删除定的key,随机删除key!

127.0.0.1:6379> smembers myset
1) "aaa"
2) "zhuabyi"
3) "hahaha"
127.0.0.1:6379> spop myset # 随机删除一些set集合中的元素!
"zhuabyi"
127.0.0.1:6379> spop myset # 随机删除一些set集合中的元素!
"aaa"
127.0.0.1:6379> smembers myset
1) "hahaha"
127.0.0.1:6379>

将一个指定的值,移动到另外一个set集合!

127.0.0.1:6379> sadd myset hello #向集合添加元素
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset haha
(integer) 1
127.0.0.1:6379> sadd myset2 set2 #向集合set2添加元素
(integer) 1
127.0.0.1:6379> smembers myset #查看所有元素
1) "world"
2) "hello"
3) "haha"
127.0.0.1:6379> smembers myset2
1) "set2"
127.0.0.1:6379> smove myset myset2 haha # 将一个指定的值,移动到另外一个set集合!
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> smembers myset2
1) "set2"
2) "haha"
127.0.0.1:6379>

数字集合类:

  • 差集 sdiff
  • 交集 sinter
  • 并集 sunion
127.0.0.1:6379> keys * #查看所有key
(empty list or set)
127.0.0.1:6379> sadd set1 a b c d #向set1集合添加 a b c d 四个元素 
(integer) 4
127.0.0.1:6379> smembers set1 #查看set1的所有元素
1) "b"
2) "c"
3) "a"
4) "d"
127.0.0.1:6379> sadd set2  c d e f #向set2集合添加 c d e f四个元素
(integer) 4
127.0.0.1:6379> smembers set2 #查看set2的所有元素
1) "c"
2) "f"
3) "e"
4) "d"
127.0.0.1:6379> sdiff set1 set2 #求差集
1) "b"
2) "a"
127.0.0.1:6379> sinter set1 set2 #交集
1) "c"
2) "d"
127.0.0.1:6379> sunion set1 set2 #并集
1) "c"
2) "a"
3) "e"
4) "f"
5) "b"
6) "d"
127.0.0.1:6379>