目录
- set
- 普通命令
- sadd
- smembers key
- sismember
- spop
- srandmember
- scard
- smove
- srem
- 集合间操作
- sinter
- sinterstore
- sunion
- sunionstore
- sdiff
- sdiffstore
- set的编码方式
- set的应用
set
谈到set这个术语,可能会有多种含义
- 集合
- 设置(get对应)
普通命令
sadd
SADD key member [member ...]//将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中
//时间复杂度:O(1)
//返回值:本次添加成功的元素个数
smembers key
SMEMBERS key//获取集合中的所有元素
//时间复杂度:O(N) N为集合中元素的个数
//返回值:所有元素的列表
sismember
SISMEMBER key member//判断⼀个元素在不在 set 中
//时间复杂度:O(1)
//返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在
spop
SPOP key [count]//从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序的
//所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
//时间复杂度:O(N), n 是 count
//返回值:取出的元素。
srandmember
srandmember key [count]//获取集合中随机一个元素
scard
SCARD key//获取⼀个 set 的基数(cardinality),即 set 中的元素个数
//时间复杂度:O(1)
//返回值:set 内的元素个数
smove
SMOVE source destination member//将⼀个元素从源 set 取出并放⼊⽬标 set 中
//时间复杂度:O(1)
//返回值:1 表⽰移动成功,0 表⽰失败
srem
SREM key member [member ...]//将指定的元素从 set 中删除
//时间复杂度:O(N), N 是要删除的元素个数
//返回值:本次操作删除的元素个数
集合间操作
sinter
SINTER key [key ...]//获取给定 set 的交集中的元素
//时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数
//返回值:交集的元素
sinterstore
SINTERSTORE destination key [key ...]//获取给定 set 的交集中的元素并保存到⽬标 set 中
//时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
//返回值:交集的元素个数
sunion
SUNION key [key ...]//获取给定 set 的并集中的元素
//时间复杂度:O(N), N 给定的所有集合的总的元素个数.
//返回值:并集的元素
sunionstore
SUNIONSTORE destination key [key ...]//获取给定 set 的并集中的元素并保存到⽬标 set 中
//时间复杂度:O(N), N 给定的所有集合的总的元素个数.
//返回值:并集的元素个数
sdiff
SDIFF key [key ...]//获取给定 set 的差集中的元素
//时间复杂度:O(N), N 给定的所有集合的总的元素个数.
//返回值:差集的元素
sdiffstore
SDIFFSTORE destination key [key ...]//获取给定 set 的差集中的元素并保存到⽬标 set 中
//时间复杂度:O(N), N 给定的所有集合的总的元素个数.
//返回值:差集的元素个数
set的编码方式
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-intset-entries 配置 (默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从⽽减少内存的使⽤。
- hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis 会使⽤ hashtable 作为集合 的内部实现。
- 当元素个数较少并且都为整数时,内部编码为 intset
- 当元素个数超过 512 个,内部编码为 hashtable
- 当存在元素不是整数时,内部编码为 hashtable
set的应用
- 给用户添加标签
- 给标签添加用户
- 删除用户下的标签
- 删除标签下的用户
- 计算用户的共同兴趣标签