集合类型也是保存多个字符串类型的元素的,元素之间是无序的且不能重复。Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。
普通命令
sadd
将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。
语法:
SADD key member [member ...]
时间复杂度:O(1)
返回值:本次添加成功的元素个数。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> sadd key 1 2 3 4 5 6
(integer) 6
smembers
获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
语法:
SMEMBERS key
时间复杂度:O(N)
返回值:所有元素的列表。
127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
sismember
判断⼀个元素在不在 set 中。
语法:
SISMEMBER key member
时间复杂度:O(1)
返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。
127.0.0.1:6379> sismember key 2
(integer) 1
127.0.0.1:6379> sismember key 4
(integer) 1
127.0.0.1:6379> sismember key 99
(integer) 0
scard
获取⼀个 set 的基数(cardinality),即 set 中的元素个数。
语法:
SCARD key
时间复杂度:O(1)
返回值:set 内的元素个数。
127.0.0.1:6379> scard key
(integer) 6
spop
从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
语法:
SPOP key [count]
时间复杂度:O(N), n 是 count
返回值:取出的元素。
127.0.0.1:6379> spop key 3
1) "4"
2) "2"
3) "5"
127.0.0.1:6379> spop key 2
1) "1"
2) "3"
127.0.0.1:6379> smembers key
1) "6"
smove
将⼀个元素从源 set 取出并放⼊⽬标 set 中。
语法:
SMOVE source destination member
时间复杂度:O(1)
返回值:1 表⽰移动成功,0 表⽰失败。
127.0.0.1:6379> smembers key
1) "2"
2) "6"
127.0.0.1:6379> smembers key1
1) "1"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> smove key1 key 1
(integer) 1
127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "6"
srem
将指定的元素从 set 中删除。
语法:
SREM key member [member ...]
时间复杂度:O(N), N 是要删除的元素个数.
返回值:本次操作删除的元素个数。
127.0.0.1:6379> srem key 6
(integer) 1
127.0.0.1:6379> srem key1 1 3
(integer) 1
127.0.0.1:6379> smembers key
1) "1"
2) "2"
127.0.0.1:6379> smembers key1
1) "4"
2) "5"
集合间操作
sinter
获取给定 set 的交集中的元素。
语法:
SINTER key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素。
127.0.0.1:6379> sadd key2 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> sadd key3 4 5 6 7 8
(integer) 5
127.0.0.1:6379> sinter key2 key3
1) "4"
2) "5"
3) "6"
sinterstore
获取给定 set 的交集中的元素并保存到⽬标 set 中。
语法:
SINTERSTORE destination key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素个数。
127.0.0.1:6379> sinterstore key4 key2 key3
(integer) 3
127.0.0.1:6379> smembers key4
1) "4"
2) "5"
3) "6"
sunion
获取给定 set 的并集中的元素。
语法:
SUNION key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素。
127.0.0.1:6379> sunion key2 key3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
sunionstore
获取给定 set 的并集中的元素并保存到⽬标 set 中。
语法:
SUNIONSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素个数。
127.0.0.1:6379> sunionstore key5 key2 key3
(integer) 8
127.0.0.1:6379> smembers key5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
sdiff
获取给定 set 的差集中的元素。
语法:
SDIFF key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素。
127.0.0.1:6379> sdiff key2 key3
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sdiff key3 key2
1) "7"
2) "8"
sdiffstore
获取给定 set 的差集中的元素并保存到⽬标 set 中。
语法:
SDIFFSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素个数。
127.0.0.1:6379> sdiffstore key6 key2 key3
(integer) 3
127.0.0.1:6379> SMEMBERS key6
1) "1"
2) "2"
3) "3"
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
- hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合的内部实现。