集合

Redis 集合允许用户将任意个不相同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据。

基本命令

SADD

添加一个或多个元素到集合,返回添加元素的数量。

1
2
3
4
5
6
7
8
9
10
11
-- 1
SADD databases "redis"

-- 2
SADD databases "mongodb" "couchdb"

-- 3
SADD databases "mysql" "postgresql" "oracle"

-- 1,因为只有 influxdb 被插入了
SADD databases "influxdb" "mysql"

时间复杂度:O(n)

SREM

从集合中删除一个或多个元素,返回移除元素的数量。

1
2
3
4
5
-- 2
SREM databases "mysql" "redis"

-- 0
SREM databases "mysql" "redis"

时间复杂度:O(n)

SMOVE

将指定元素从 source 集合移动到 target 集合,返回操作结果 bool。

如果 source 或者指定元素不存在,返回 false。

如果 target 中已经有指定元素,则只会移除 source 中的元素,返回 true。

1
2
3
4
5
6
7
8
9
-- 将 mongodb 从 databases 移动到 doc::databases 集合中, true
SMOVE databases doc::databases "mongodb"

-- false
SMOVE databases doc::databases "mongodb"

SADD databases "mongodb"
-- doc::databases 已经存在 mongodb,则会删除 databases 中的 mongodb,返回 true
SMOVE databases doc::databases "mongodb"

时间复杂度:O(1)

SMEMBERS

获取集合中所有元素。

1
2
-- mysql postgresql oracle
SMEMBERS databases

时间复杂度:O(n)

SCARD

获取集合中元素的数量。

1
2
-- 3
SCARD databases

时间复杂度:O(1)

SISMEMBER

检查指定元素是否在集合中,返回 bool。

如果集合不存在,返回 false。

1
2
3
4
5
-- true
SISMEMBER databases "mysql"

-- false
SISMEMBER databases "mongodb"

时间复杂度:O(1)

SRANDMEMBER

随机获取集合中的指定个数元素,默认为 1。

当指定个数 > SCARD 时,返回所有。

如果指定个数 < 0 时,返回指定个数绝对值。

若集合不存在,返回 nil

1
2
3
4
5
6
7
8
9
10
11
-- 随机返回 1 个
SRANDMEMBER databases

-- 随机返回 2 个
SRANDMEMBER databases 2
SRANDMEMBER databases -2

-- 返回 3 个
SCARD databases
-- 5 > 3,则返回所有
SRANDMEMBER databases 5

时间复杂度:O(n)

SPOP

同 SRANDMEMBER,区别在于:

  1. 会将返回的元素从集合中移除;
  2. 指定元素不能为 < 0;

时间复杂度:O(n)

SINSER

返回指定集合的交集,若集合不存在,返回空。

1
2
3
4
5
6
7
SADD s1 "a" "b"
SADD s2 "b" "c" "d"

-- 返回 s1 和 s2 的交集
SINTER s1 s2
-- 返回 s1、s2 和 s3 的交集
SINTER s1 s2 s3

时间复杂度:O(n*m)

SINTERSTORE

同 SINTER,有以下区别:

  1. 会将指定集合的交集插入到新的集合中;
  2. 指定集合不存在或没有交集,则返回空,否则返回集合中元素数量;
1
2
3
4
5
6
SADD s1 "a" "b"
SADD s2 "b" "c" "d"
SADD s3 "b" "c" "d"

-- 将 s1 s2 s3 的交集插入到 insert 集合中
SINTERSTORE insert s1 s2 s3

时间复杂度:O(n*m)

SUNION

返回指定集合的并集。

1
2
3
4
5
6
7
8
9
SADD s1 "a" "b"
SADD s2 "b" "c" "d"

-- 返回 s1 和 s2 的并集
SUNION s1 s2
-- 返回 s1 和 s22 的并集,s22 不存在,则返回 s1 的集合
SUNION s1 s22
-- 返回 s1、s2 和 s3 的并集
SINTER s1 s2 s3

时间复杂度:O(max(n, m))

SUNIONSTORE

同 SUNION,有以下区别:

  1. 会将指定集合的交集插入到新的集合中;
  2. 指定集合不存在或没有交集,则返回空,否则返回集合中元素数量;
1
2
3
4
5
6
SADD s1 "a" "b"
SADD s2 "b" "c" "d"
SADD s3 "b" "c" "d"

-- 将 s1 s2 s3 的并集插入到 union 集合中
SUNIONSTORE union s1 s2 s3

时间复杂度:O(max(n, m))

对比列表

  1. 列表是有序,集合无序;
  2. 列表可以存储重复元素,集合不行;

总结

  • 集合只允许添加任意个各不相同的元素;
  • 所有针对单个元素的集合操作,复杂度都为O(1);
  • 集合的存储是无序的;
  • SRANDMEMBER 命令 peek 一个随机选中的元素,而 SPOP 命令 pop一个随机选中的元素;
  • 应该使用集合的 store 操作;