你必须非常努力,才能看起来毫不费力!

微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero !

前言

Set,即集合,与数学中的集合概念一致,不过Redis Set中包含的元素类型是string。Set中元素值是唯一的,不能出现重复的数据。上篇文章介绍了Set类型中,单个集合的操作,下面就来看下多个集合之间操作相关的指令吧。

SINTER

可用版本:>= 1.0.0

时间复杂度:O(N*M),N为所有给定集合中最小的集合长度,M为给定集合的个数

命令格式

SINTER key [key ...]

命令描述

  • 返回给定集合的交集

例如:

key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SINTER key1 key2 key3 = {c}
  • 当给定集合中包含空集时,返回的结果一定也是空集,因为空集与其他集合的交集一定是空集

返回值

数组:所有集合交集的元素列表

示例

127.0.0.1:6379> sadd myset hello world
(integer) 2
127.0.0.1:6379> sadd otherset hello
(integer) 1
127.0.0.1:6379> sinter myset otherset
1) "hello"

SINTERSTORE

可用版本:>= 1.0.0

时间复杂度:O(N*M),N为所有给定集合中最小的集合长度,M为给定集合的个数

命令格式

SINTERSTORE destination key [key ...]

命令描述

  • 命令与与​​SINTER​​ 功能类似,即取多个集合的交集,但是不返回结果,而是将结果保存到​​destination​​中
  • 如果​​destination​​集合已经存在,数据将会被覆盖

返回值

整数值:结果集长度

示例

# dest集合
127.0.0.1:6379> sadd dest test
(integer) 1
127.0.0.1:6379> smembers dest
1) "test"

# 两个集合
127.0.0.1:6379> sadd myset hello world
(integer) 2
127.0.0.1:6379> sadd myset2 hello world lifelmy
(integer) 3

# 取交集后存入dest
127.0.0.1:6379> sinterstore dest myset myset2
(integer) 2

# dest中原有的“test”被覆盖掉
127.0.0.1:6379> smembers dest
1) "hello"
2) "world"

SUNION

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

SUNION key [key ...]

命令描述

  • 返回给定集合的并集

例如:

key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SUNION key1 key2 key3 = {a,b,c,d,e}

返回值

数组:所有集合并集的元素列表

示例

127.0.0.1:6379> sadd uset hello world
(integer) 2
127.0.0.1:6379> sadd uset1 lifelmy test
(integer) 2
127.0.0.1:6379> sunion uset uset1
1) "lifelmy"
2) "hello"
3) "test"
4) "world"

SUNIONSTORE

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

SUNIONSTORE destination key [key ...]

命令描述

  • 命令与与​​SUNION​​ 功能类似,即取多个集合的并集,但是不返回结果,而是将结果保存到​​destination​​中
  • 如果​​destination​​集合已经存在,数据将会被覆盖

返回值

整数值:结果集长度

示例

127.0.0.1:6379> sadd uset hello world
(integer) 2
127.0.0.1:6379> sadd uset1 lifelmy test
(integer) 2

127.0.0.1:6379> sunion uset uset1
1) "lifelmy"
2) "hello"
3) "test"
4) "world"

SDIFF

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

SDIFF key [key ...]

命令描述

  • 返回第一个集合,与后续所有集合的差集

例如:

key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SDIFF key1 key2 key3 = {b,d}

返回值

数组:结果集的元素列表

示例

127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 a b
(integer) 2
127.0.0.1:6379> sadd key3 a b c
(integer) 3

# key1集合与 key2 key3集合的差集
127.0.0.1:6379> sdiff key1 key2 key3
1) "d"

SDIFFSTORE

可用版本:>= 1.0.0

时间复杂度:O(N),N给定集合的元素总数

命令格式

SDIFFSTORE destination key [key ...]

命令描述

  • 命令与与​​SDIFF​​ 功能类似,即计算第一个集合与后续给定集合的差集,但是不返回结果,而是将结果保存到​​destination​​中
  • 如果​​destination​​集合已经存在,数据将会被覆盖

返回值

整数值:结果集长度

示例

127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 a b
(integer) 2
127.0.0.1:6379> sadd key3 a b c
(integer) 3

# 取差集后,结果保存到key4集合中
127.0.0.1:6379> sdiffstore key4 key1 key2 key3
(integer) 1
127.0.0.1:6379> smembers key4
1) "d"

更多

个人博客: lifelmy.github.io/

微信公众号:漫漫Coding路