集合(set)类型可以可以用来保存多个字符串元素,和列表不同的是,集合是无序的,不允许有重复元素的。
命令
集合内操作
sadd key element [element ...] 添加元素,返回添加成功的个数
srem key element [element ...] 删除元素 ,返回删除元素的个数
scard key 计算元素的个数,时间复杂度O(1),不会遍历所有的元素,直接使用Redis的内部变量
127.0.0.1:6379> sadd testset a b c d (integer) 4 127.0.0.1:6379> srem testset b (integer) 1 127.0.0.1:6379> scard testset (integer) 3
sismenber key element 判断元素是否存在,如果存在返回1,否则返回0
srandmember key [count] 从集合随机返回指定个数元素,不写默认1,不会从集合删除元素
spop key [count] 随机弹出元素。删除弹出的元素
`127.0.0.1:6379> sismember testset a (integer) 1 127.0.0.1:6379> srandmember testset 2
- "d"
- "a"`
`127.0.0.1:6379> spop testset 2
- "a"
- "d"`
smembers key 获取所有元素
`127.0.0.1:6379> sadd testset2 a b c (integer) 3 127.0.0.1:6379> smembers testset2
- "b"
- "c"
- "a"`
smembers lrange hgetall 都属于比较重的命令,如果元素过多可能阻塞Redis
集合间操作
sinter key [key ...] 返回多个集合的交集
sdiff key [key ...] 返回差集
sunion key [key ...] 返回并集
`127.0.0.1:6379> sadd set1 a b c d (integer) 4 127.0.0.1:6379> sadd set2 c d e f (integer) 4 127.0.0.1:6379> sinter set1 set2
- "d"
- "c"`
`127.0.0.1:6379> sdiff set1 set2
- "b"
- "a" 127.0.0.1:6379> sdiff set2 set1
- "f"
- "e"`
`127.0.0.1:6379> sunion set1 set2
- "d"
- "c"
- "a"
- "f"
- "e"
- "b"`
sinterstore dest key [key ...] 将交集结果保存到dest中
sdiffstore dest key [key ...] 将差集保存到dest中
sunionstore dest key [key ...] 将并集保存到dest中
常用命令时间复杂度
| 命令 | 时间复杂度 |
|---|---|
| sadd key element [element ...] | O(k),k是元素的个数 |
| srem key element[element ...] | O(k),k是元素的个数 |
| scard key | O(1) |
| sismember key element | O(1) |
| srandmember key [count] | O(count) |
| spop key | O(1) |
| smembers key | O(n),n是元素的总和 |
| sinter key [key ...] | O(k*m),K是多个集合中元素最少的个数,m是集合的个数 |
| sdiff key [key ...] | O(k), k是多个集合的元素个数总和 |
| sunion key [key ...] | O(k), k是多个集合的元素个数总和 |
内部编码
集合的内部编码有两种
- intset 整数集合,当元素都是整数并且元素的个数小于set-max-intset-entries配置(默认512)时,redis用intset实现集合,减少内存的使用
- hashtable 哈希表,当无法满足intset的条件时,使用hashtable实现
127.0.0.1:6379> sadd setint 1 2 3 (integer) 3
127.0.0.1:6379> object encoding setint "intset"
`127.0.0.1:6379> smembers set1
- "2"
- "1"
- "a" 127.0.0.1:6379> object encoding set1 "hashtable"`
使用场景
- 客户标签,兴趣爱好等,
- 抽奖 spop/srandmember
- 社交方向的需求 sinter