文章目录
  1. Redis基本命令的使用-集合
  2. 1. 简介
  3. 2. 命令
    1. 2.1 集合操作
    2. 2.2 集合间操作
  4. 3. 内部编码
    1. 3.1 intset(整数集合)
    2. 3.2 hashtable(哈希表)
  5. 4. 使用场景
    1. 4.1 标签

[TOC]

Redis基本命令的使用-集合

1. 简介

集合也是用来保存多个字符串元素,但和列表不一样的是集合不允许有重复元素,并且集合中的元素是无序的

Redis除了提供集合的增删改查之外,还支持多个集合的取交集、并集和差集。

2. 命令

2.1 集合操作

  • 添加元素
1
2
3
4
5
6
7
8
9
$ sadd key member [member ...]

> 示例
127.0.0.1:6379> sadd skey1 a b c b
(integer) 3
127.0.0.1:6379> sadd skey1 a
(integer) 0

# 返回添加成功的个数
  • 删除元素
1
2
3
4
5
6
7
$ srem key member [member ...]

> 示例
127.0.0.1:6379> srem skey1 a b
(integer) 2

# 返回删除成功的个数
  • 返回元素个数
1
2
3
4
5
6
7
$ scard key

> 示例
127.0.0.1:6379> scard skey1
(integer) 1

# 时间复杂度是O(1),不会遍历所有元素,取的Redis内部变量
  • 判断元素存在性
1
2
3
4
5
6
7
8
9
$ sismember key member

> 示例
127.0.0.1:6379> sismember skey1 a
(integer) 0
127.0.0.1:6379> sismember skey1 c
(integer) 1

# 存在返回1,否则返回0
  • 随机获取元素
1
2
3
4
5
6
7
8
9
$ srandmember key [count]

> 示例
127.0.0.1:6379> srandmember skey1
"c"
127.0.0.1:6379> srandmember skey1 2
1) "c"

# count默认为1
  • 随机弹出元素
1
2
3
$ spop key [count]

# Redis3.2支持count参数,count默认为1
  • 获取所有元素
1
2
3
4
5
$ smembers key

> 示例
127.0.0.1:6379> smembers skey1
1) "c"

注意smemberslrangehgetall都属于比较重的命令,元素过多就会阻塞Redis,此时可以使用sscan来完成,具体后续会说明。

2.2 集合间操作

准备两个集合如下:

1
2
3
4
127.0.0.1:6379> sadd user:1:follow it music his sports
(integer) 4
127.0.0.1:6379> sadd user:2:follow it news ent sports
(integer) 4
  • 交集
1
2
3
4
5
6
$ sinter key [key ...]

> 示例
127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "sports"
2) "it"
  • 并集
1
2
3
4
5
6
7
8
9
10
$ sunion key [key ...]

> 示例
127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "news"
2) "ent"
3) "his"
4) "it"
5) "sports"
6) "music"
  • 差集
1
2
3
4
5
6
$ sdiff key [key ...]

> 示例
127.0.0.1:6379> sdiff user:1:follow user:2:follow
1) "his"
2) "music"
  • 将交集、并集、差集结果保存
1
2
3
$ sinterstore destination key [key ...]
$ sunionstore destination key [key ...]
$ sdiffstore destination key [key ...]

由于集合间运算当元素较多时会很耗时,所有Redis提供了上述命令用来存储执行结果。

3. 内部编码

3.1 intset(整数集合)

当集合的元素都是整数个数小于set-max-intset-entries(默认512个),Redis会使用intset作为列表的内部实现,减少内存使用。

3.2 hashtable(哈希表)

当无法满足intset条件时,Redis会使用hashtable的方式。

4. 使用场景

4.1 标签

可以在物品标签人物兴趣等应用。如给用户添加标签,或者给标签添加人。

文章目录
  1. Redis基本命令的使用-集合
  2. 1. 简介
  3. 2. 命令
    1. 2.1 集合操作
    2. 2.2 集合间操作
  4. 3. 内部编码
    1. 3.1 intset(整数集合)
    2. 3.2 hashtable(哈希表)
  5. 4. 使用场景
    1. 4.1 标签