目录
- 0.前言
- 1.常用命令
- 1.SADD
- 2.SMEMBERS
- 3.SISMEMBER
- 4.SCARD
- 5.SPOP
- 6.SMOVE
- 7.SREM
 
- 2.集合间操作
- 0.是什么?
- 1.SINTER
- 2.SINTERSTORE
- 3.SUNION
- 4.SUNIONSTORE
- 5.SDIFF
- 6.SDIFFSTORE
 
- 3.内部编码
- 1.intset(整数集合)
- 2.hashtable(哈希表)
 
- 4.使用场景
0.前言
-  集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是: - 集合中元素之间是⽆序的
- 集合中元素不允许重复
  
 
-  一个集合中最多可以存储 2 32 − 1 2^{32} - 1 232−1个元素 
-  Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题 
1.常用命令
1.SADD
- 功能:将⼀个或者多个元素添加到set中- 注意:重复的元素⽆法添加到set中
 
- 注意:重复的元素⽆法添加到
- 语法:SADD key member [member ...]
- 返回值:本次添加成功的元素个数
- 时间复杂度: O ( 1 ) O(1) O(1)
2.SMEMBERS
- 功能:获取一个set中的所有元素- 注意:元素间的顺序是无序的
 
- 语法:SMEMBERS key
- 返回值:所有元素的列表
- 时间复杂度: O ( N ) O(N) O(N)
3.SISMEMBER
- 功能:判断一个元素在不在set中
- 语法:SISMEMBER key member
- 返回值:: 
  - 1:表⽰元素在set中
- 0:表⽰元素不在set中或者key不存在
 
- 1:表⽰元素在
- 时间复杂度: O ( 1 ) O(1) O(1)
4.SCARD
- 功能:获取一个set的基数(cardinality),即set中的元素个数
- 语法:SCARD key
- 返回值:set内的元素个数
- 时间复杂度: O ( 1 ) O(1) O(1)
5.SPOP
- 功能:从set中删除并返回⼀个或者多个元素- 注意:由于set内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的
 
- 注意:由于
- 语法:SPOP key [count]
- 返回值:取出的元素
- 时间复杂度: 
      
       
        
        
          O 
         
        
          ( 
         
        
          N 
         
        
          ) 
         
        
       
         O(N) 
        
       
     O(N),N是count
6.SMOVE
- 功能:将一个元素从源set取出并放入目标set中
- 语法:SMOVE src dest member
- 返回值:1表示移动成功,0表示失败
- 时间复杂度: O ( 1 ) O(1) O(1)
7.SREM
- 功能:将指定的元素从set中删除
- 语法:SREM key member [member ...]
- 返回值:本次操作删除的元素个数
- 时间复杂度: O ( N ) O(N) O(N),N是要删除的元素个数
2.集合间操作
0.是什么?
- set支持交集(- inter)、并集(- union)、差集(- diff)
  
1.SINTER
- 功能:获取给定set的交集中的元素
- 语法:SINTER key [key ...]
- 返回值:交集的元素
- 时间复杂度: O ( N ∗ M ) O(N*M) O(N∗M),N是最⼩的集合元素个数,M是最⼤的集合元素个数
2.SINTERSTORE
- 功能:获取给定set的交集中的元素并保存到目标set中
- 语法:`SINTERSTORE dest key [key …]
- 返回值:交集的元素个数
- 时间复杂度: O ( N ∗ M ) O(N*M) O(N∗M),N是最⼩的集合元素个数,M是最⼤的集合元素个数
3.SUNION
- 功能:获取给定set的并集中的元素
- 语法:SUNION key [key ...]
- 返回值:并集的元素
- 时间复杂度: O ( N ) O(N) O(N),N给定的所有集合的总的元素个数
4.SUNIONSTORE
- 功能:获取给定set的并集中的元素并保存到⽬标set中
- 语法:SUNIONSTORE dest key [key ...]
- 返回值:并集的元素个数
- 时间复杂度: O ( N ) O(N) O(N),N给定的所有集合的总的元素个数
5.SDIFF
- 功能:获取给定set的差集中的元素
- 语法:SDIFF key [key ...]
- 返回值:差集的元素
- 时间复杂度: O ( N ) O(N) O(N),N给定的所有集合的总的元素个数
6.SDIFFSTORE
- 功能:获取给定set的差集中的元素并保存到目标set中
- 语法:SDIFFSTORE dest key [key ...]
- 返回值:差集的元素个数
- 时间复杂度: O ( N ) O(N) O(N),N给定的所有集合的总的元素个数
3.内部编码
1.intset(整数集合)
- 当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置(默认512个)时,Redis会选⽤intset来作为集合的内部实现,从⽽减少内存的使⽤
2.hashtable(哈希表)
- 当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合的内部实现
4.使用场景
- 集合类型⽐较典型的使⽤场景是标签(tag)- 例如:⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐
 
- 示例: 
  - 给用户添加标签sadd user:1:tags tag1 tag2 tag5 sadd user:2:tags tag2 tag3 tag5 ... sadd user:k:tags tag1 tag2 tag4
- 给标签添加用户sadd tag1:users user:1 user:3 sadd tag2:users user:1 user:2 user:3 ... sadd tagk:users user:1 user:4 user:9 user:28
- 删除用户下的标签srem user:1:tags tag1 tag5 ...
- 删除标签下的用户srem tag1:users user:1 srem tag5:users user:1 ...
- 计算⽤⼾的共同兴趣标签sinter user:1:tags user:2:tags
 
- 给用户添加标签



















