Redis 集合操作实战(全)

目录

SADD 插入集合

SCARD 取元素数量

SPOP 随机移除元素

SREM 移除多个元素

SMOVE 移动元素到别的集合

SMEMBERS 取所有成员

SRANDMEMBER 取指定数量元素

SISMEMBER 判断元素是否存在

SUNION 多集合求并集

SUNIONSTORE 多集合求并集(存储)

SINTER 多集合求交集

SINTERSTORE 多集合求取交集(存储)

SDIFF 多集合求取差集

SDIFFSTORE 多集合求取差集(存储)

SSCAN 迭代


SADD 插入集合

SADD key member [member ...]:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

  • 假如 key 不存在,则创建一个只包含 member 元素作成员的集合
  • 当 key 不是集合类型时,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e f g h i j k l m n # 向key中添加集合元素,key不存在则自动创建空的key集合
(integer) 14
127.0.0.1:6379> set name lisi # 初始化非集合key
OK
127.0.0.1:6379> sadd name zhangsan # 向非集合中执行sadd
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是被添加的元素的数量。

返回值:

  • 被添加到集合中的新元素的数量,不包括被忽略的元素。
  • 对非集合执行sadd,报错。

SCARD 取元素数量

SCARD key:返回集合中的元素数量

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> scard myset2    # 不存在key
(integer) 0
127.0.0.1:6379> sadd myset a b c d e f g h i j k l m n
(integer) 14
127.0.0.1:6379> scard myset     # 存在集合key
(integer) 14
127.0.0.1:6379> set name lisi   # 初始化非集合key
OK
127.0.0.1:6379> scard name      # 对非集合key执行scard命令
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 不存在key似为空集合,返回0
  • 存在集合key,返回元素个数
  • 对非集合key,报错


SPOP 随机移除元素

SPOP key:移除并返回集合中的一个随机元素。

  • 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a   # 初始化集合
(integer) 1
127.0.0.1:6379> spop myset
"a"
127.0.0.1:6379> spop myset     # 集合为空
(nil)
127.0.0.1:6379> spop myset2    # 不存在的key
(nil)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> spop name      # key 不为集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 被随机移除的元素。
  • 当 key 不存在或 key 是空集时,返回 nil
  • 当 key 不为集合,报错。

SREM 移除多个元素

SREM key member [member ...]:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e    # 初始化集合
(integer) 5
127.0.0.1:6379> srem myset a b c d      # 移除 a b c d
(integer) 4
127.0.0.1:6379> srem myset a b c d e    
(integer) 1                             # 移除 a b c d e,不存在元素忽视了
127.0.0.1:6379> srem myset2 a           
(integer) 0                             # 移除不存在key似为空集合
127.0.0.1:6379> set name list
OK
127.0.0.1:6379> srem name 1             # key不为集合,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度为O(N), N 为给定 member 元素的数量

返回值:

  • 不存在key似为空集合,返回0。
  • key为集合,返回成功移除的元素的数量(不包括被忽视的元素),不存在的元素直接被忽视。
  • key不为集合,报错。

SMOVE 移动元素到别的集合

SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合。

  • 该操作是原子性的。
  • 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
  • 当 destination 集合已经包含 member 元素时,SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
  • 当 source 或 destination 不是集合类型时,返回一个错误。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b    # 初始化集合
(integer) 2
127.0.0.1:6379> smove s1 dest a    # 移动集合
(integer) 1
127.0.0.1:6379> smembers s1        # 查看集合元素
1) "b"
127.0.0.1:6379> smembers dest      # 查看dest元素
1) "a"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> smove s1 name b    # 有非集合key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 如果 member 元素被成功移除,返回 1 。
  • 如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。

SMEMBERS 取所有成员

SMEMBERS key:返回集合 key 中的所有成员。

  • 不存在的 key 被视为空集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c d e
(integer) 5
127.0.0.1:6379> smembers s1
1) "d"
2) "b"
3) "a"
4) "c"
5) "e"
127.0.0.1:6379> smembers s2
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> smembers name
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 为集合的基数。

返回值:

  • 集合中的所有成员。
  • 不存在的key返回空。
  • 非集合key,报错。

SRANDMEMBER 取指定数量元素

SRANDMEMBER key [count]:取指定数量count的元素。

  • count不指定:默认为1,即随机取一个元素。
  • count为正数:count小于集合大小,返回不重复的count个元素的数组;count大于等于集合大小,则返回整个集合的元素。
  • count为负数:那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> srandmember s1
"a"
127.0.0.1:6379> srandmember s1 2
1) "a"
2) "b"
127.0.0.1:6379> srandmember s1 5
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> srandmember s1 -5
1) "a"
2) "c"
3) "a"
4) "c"
5) "c"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> srandmember lisi
(nil)

时间复杂度:

  • 只提供 key 参数时为 O(1) 。
  • 如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。

返回值:

  • 只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 
  • 如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
  • 对非集合key执行srandmember返回nil。

SISMEMBER 判断元素是否存在

SISMEMBER key member:判断 member 元素是否集合 key 的成员。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c    # 初始化集合
(integer) 3
127.0.0.1:6379> sismember s1 a   # 查看是否存在
(integer) 1
127.0.0.1:6379> sismember s1 f
(integer) 0
127.0.0.1:6379> sismember s2 f   # 不存在key似为空集合
(integer) 0
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sismember name f # 对非集合key操作,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 存在返回1
  • 不存在返回0
  • 对非集合执行 SISMEMBER 命令,报错。

SUNION 多集合求并集

SUNION key [key ...]:返回一个集合的全部成员,该集合是所有给定集合的并集。

  • 不存在的 key 被视为空集。
  • 原理:把所有key集合的元素组合在一起并且去重后的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b    # 初始化集合
(integer) 2
127.0.0.1:6379> sadd myset2 a b c d    # 初始化集合
(integer) 4
127.0.0.1:6379> sunion myset myset2 myset3 # myset3不存在被似为空集合
1) "d"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sunion myset name        # 有key存在且不为集合,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 并集成员的列表。
  • 有key存在且不为集合则报错。

SUNIONSTORE 多集合求并集(存储)

SUNIONSTORE destination key [key ...]:与SUNION操作相似。

  • 不同点:它将结果保存到 destination 集合,而不是简单地返回结果集。
  • 如果 destination 已经存在,则将其覆盖。
  • destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b    # 初始化集合
(integer) 2
127.0.0.1:6379> sadd s2 c
(integer) 1
127.0.0.1:6379> sunionstore dest s1 s2 s3 # 取并集
(integer) 3
127.0.0.1:6379> smembers dest             # 查看dest信息
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sunionstore dest s1 s2 s3 name    # 有非命令key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 结果集中的元素数量。
  • 对非集合key执行SUNIONSTORE命令报错。

SINTER 多集合求交集

SINTER key [key ...]:返回所有给定集合的交集。

  • 不存在的 key 被视为空集。
  • 原理:取都存在于所有key集合中的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c d e    # 初始化集合
(integer) 5
127.0.0.1:6379> sadd s2 b e f g      # 初始化集合
(integer) 4
127.0.0.1:6379> sinter s1 s2         # 取交集
1) "e"
2) "b"
127.0.0.1:6379> sinter s1 s2 s3      # 取交集,有不存在的key似为空集
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sinter s1 s2 name    # 存在不为集合的key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

返回值:

  • 交集成员的列表(不存在key似为空集合)。
  • 存在key不为集合,报错。

SINTERSTORE 多集合求取交集(存储)

SINTERSTORE destination key [key ...]:跟SINTER操作相似。

  • 不同点:SINTERSTORE 它将结果保存到 destination 集合中。
  • 如果 destination 已经存在,则将其覆盖。
  • destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b d    # 初始化集合
(integer) 3
127.0.0.1:6379> sadd s2 d e f    # 初始化集合
(integer) 3
127.0.0.1:6379> sinterstore dest s1 s2
(integer) 1
127.0.0.1:6379> smembers dest    # 查看集合dest
1) "d"
127.0.0.1:6379> set name lisi 
OK
127.0.0.1:6379> sinterstore dest s1 s2 name # 存在不为集合的key
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

返回值:

  • 结果集中的成员数量。
  • 存在key不为集合,报错。

SDIFF 多集合求取差集

SDIFF key [key ...]:取给定集合之间的差集

  • 不存在的key似为空集合
  • 原理:以第个key集合为主减去存在于后面所有key集合的并集的元素,剩下的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e # 初始化几个集合key
(integer) 5
127.0.0.1:6379> sadd myset2 d e
(integer) 2
127.0.0.1:6379> sadd myset3 c d
(integer) 2
127.0.0.1:6379> sdiff myset myset2 myset3 # 取三个集合的差集
1) "b"
2) "a"
127.0.0.1:6379> sdiff myset myset2 myset3 myset4 # 取4个集合的差集,其中一个不存在似为空集合
1) "b"
2) "a"
127.0.0.1:6379> set name lisi # 定义一个非集合key
OK
127.0.0.1:6379> sdiff myset myset2 myset3 myset4 name # 有一个key不为集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 交集成员的列表
  • 若有不存在的key,似为空集合
  • 若有非集合key,报错


SDIFFSTORE 多集合求取差集(存储)

SDIFFSTORE destination key [key ...]:与SDIFF操作相拟。

  • 不同点:SDIFFSTORE 它将结果保存到 destination 集合中。
  • 如果 destination 已经存在,则将其覆盖。
  • destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 'baidu' 'google' 'alibaba' 'banana' # 初始化集合
(integer) 4
127.0.0.1:6379> sadd s2 'apple' 'banana' 'orange'           # 初始化集合
(integer) 3
127.0.0.1:6379> sdiffstore dest s1 s2                       # 求差集并保存到dest中
(integer) 3
127.0.0.1:6379> smembers dest                               # 查看dest中元素
1) "baidu"
2) "google"
3) "alibaba"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sdiffstore dest s1 name                     # 存在不为集合的key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 结果集中的成员数量。
  • 存在key不为集合,报错。


SSCAN 迭代

  • 详见SCAN命令操作实战。

你可能感兴趣的:(Redis,redis,缓存)