set(集合):其实就是数学中的集合,集合中元素要具备三个特性:确定性、无序性、互异性。
- 确定性:一个元素要么属于集合,要么不属于集合。
- 无序性:集合中每个元素的地位相当,没有顺序
- 互异性:集合中的元素都是不同,也就是一个元素在一个集合中只能出现一次。
简单使用
sadd:往集合中添加元素,语法:SADD key member [member ...]
。
127.0.0.1:6379> sadd fruit apple banana orange
(integer) 3
scard:获取集合中元素的个数,语法:SCARD key
。
127.0.0.1:6379> scard fruit
(integer) 3
sismember:判断一个元素是否是集合中的元素,语法:SISMEMBER key member
。
127.0.0.1:6379> sismember fruit apple
(integer) 1
127.0.0.1:6379> sismember fruit pear
(integer) 0
smembers:查询集合中所有的元素,语法:SMEMBERS key
。
127.0.0.1:6379> smembers fruit
1) "orange"
2) "banana"
3) "apple"
srandmember:从集合中随机返回指定个数的元素,语法:SRANDMEMBER key [count]
。
127.0.0.1:6379> srandmember fruit
"apple"
127.0.0.1:6379> srandmember fruit 2
1) "banana"
2) "apple"
spop:从集合中随机移除指定个数的元素,语法:SPOP key [count]
。
127.0.0.1:6379> spop fruit 1
1) "apple"
127.0.0.1:6379> smembers fruit
1) "orange"
2) "banana"
srem:从集合中移除指定元素,语法:SREM key member [member ...]
。
127.0.0.1:6379> srem fruit orange banana
(integer) 2
127.0.0.1:6379> smembers fruit
(empty array)
sinter:返回指定集合之间的交集,语法:SINTER key [key ...]
。
127.0.0.1:6379> sadd f1 morris bob tom marry jack
(integer) 5
127.0.0.1:6379> sadd f2 bob sean lily tom
(integer) 4
127.0.0.1:6379> sinter f1 f2
1) "tom"
2) "bob"
sinterstore:将指定集合之间的交集存储到另一个集合中,语法:SINTERSTORE destination key [key ...]
。
127.0.0.1:6379> sinterstore interf12 f1 f2
(integer) 2
127.0.0.1:6379> smembers interf12
1) "tom"
2) "bob"
sunion:返回指定集合之间的并集,语法:SUNION key [key ...]
。
127.0.0.1:6379> sunion f1 f2
1) "tom"
2) "morris"
3) "marry"
4) "jack"
5) "bob"
6) "sean"
7) "lily"
sunionstore:将指定集合之间的并集存储到另一个集合中,语法:SUNIONSTORE destination key [key ...]
。
127.0.0.1:6379> smembers unionf12
1) "tom"
2) "morris"
3) "marry"
4) "jack"
5) "bob"
6) "sean"
7) "lily"
sdiff:返回指定集合之间的差集,语法:SUNION key [key ...]
。
127.0.0.1:6379> sdiff f1 f2
1) "marry"
2) "morris"
3) "jack"
127.0.0.1:6379> sdiff f2 f1
1) "sean"
2) "lily"
sdiffstore:将指定集合之间的差集存储到另一个集合中,语法:SDIFFSTORE destination key [key ...]
。
127.0.0.1:6379> sdiffstore difff12 f1 f2
(integer) 3
127.0.0.1:6379> smembers difff12
1) "morris"
2) "marry"
3) "jack"
smove:将member从source集合移动到destination集合中,如果source集合不存在或者不包含指定的元素,smove命令不执行任何操作并且返回0,否则对象将会从source集合中移除,并添加到destination集合中去,如果destination集合已经存在该元素,则smove命令仅将该元素从source集合中移除,如果source和destination不是集合类型,则返回错误。语法:SMOVE source destination member
。
127.0.0.1:6379> smove f1 f3 morris
(integer) 1
127.0.0.1:6379> smembers f3
1) "morris"
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数且元素个数小于
set-max-intset-entries
配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。 - hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。```
127.0.0.1:6379> object encoding f3
"hashtable"
127.0.0.1:6379> sadd set 1 2 3
(integer) 3
127.0.0.1:6379> object encoding set
"intset"
使用场景
- 交集:例如微信的朋友圈点赞,你只能看点你和朋友的共同好友点的赞。
127.0.0.1:6379> sadd user1 zhangsan lisi wangwu zhaoliu
(integer) 4
127.0.0.1:6379> sadd user2 lisi zhaoliu tianqi
(integer) 3
127.0.0.1:6379> sinter user1 user2
1) "zhaoliu"
2) "lisi"
- 抽奖。
先看以下smember命令的复杂用法,语法:SRANDMEMBER key [count]
,
- count不传,默认会随机返回一个元素。
- count为0,不返回元素。
- count为正数,不会返回重复的元素,如果count参数的值大于集合内的元素数量,此命令将会仅返回整个集合,没有额外的元素。
- count为负数,可能返回重复的元素,以及总是会返回我们请求的数量的元素。
127.0.0.1:6379> sadd number one two three four five six
127.0.0.1:6379> srandmember number 0
(empty array)
127.0.0.1:6379> srandmember number 2
1) "two"
2) "six"
127.0.0.1:6379> srandmember number 7
1) "two"
2) "three"
3) "four"
4) "five"
5) "one"
6) "six"
127.0.0.1:6379> srandmember number -3
1) "two"
2) "three"
3) "three"
127.0.0.1:6379> srandmember number -9
1) "two"
2) "four"
3) "five"
4) "three"
5) "six"
6) "six"
7) "five"
8) "one"
9) "four"
如果抽奖的礼品的数量n大于抽奖的人数,可以使用命令srandmember users n
。
如果抽奖的礼品的数量n小于抽奖的人数,可以使用命令srandmember users -n
。