Redis 之集合

160 阅读2分钟

集合(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

  1. "d"
  2. "a"`

`127.0.0.1:6379> spop testset 2

  1. "a"
  2. "d"`

smembers key 获取所有元素

`127.0.0.1:6379> sadd testset2 a b c (integer) 3 127.0.0.1:6379> smembers testset2

  1. "b"
  2. "c"
  3. "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

  1. "d"
  2. "c"`

`127.0.0.1:6379> sdiff set1 set2

  1. "b"
  2. "a" 127.0.0.1:6379> sdiff set2 set1
  3. "f"
  4. "e"`

`127.0.0.1:6379> sunion set1 set2

  1. "d"
  2. "c"
  3. "a"
  4. "f"
  5. "e"
  6. "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 keyO(1)
sismember key elementO(1)
srandmember key [count]O(count)
spop keyO(1)
smembers keyO(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

  1. "2"
  2. "1"
  3. "a" 127.0.0.1:6379> object encoding set1 "hashtable"`
使用场景
  • 客户标签,兴趣爱好等,
  • 抽奖 spop/srandmember
  • 社交方向的需求 sinter