Redis命令-Set

Tuesday, January 16, 2018

sadd [key] [member1] [member2] … [membern]

向指定key中添加一个或多个元素,如果key不存在,则会先创建key,已经存在于集合中的元素将会被忽略

如果key存在且不是集合类型,则会返回一个错误

Redis 2.4 版本以前,只能添加一个元素

# 正常情况
127.0.0.1:6379> sadd sadd-key a b c d e
(integer) 5

# key不是集合类型
127.0.0.1:6379> set str-key 1
OK
127.0.0.1:6379> type str-key
string
127.0.0.1:6379> sadd str-key a
(error) WRONGTYPE Operation against a key holding the wrong kind of value

scard [key]

获取集合的成员数,key不存在时返回0

# 正常情况
127.0.0.1:6379> scard sadd-key
(integer) 5

# key不存在
127.0.0.1:6379> exists scard-key
(integer) 0
127.0.0.1:6379> scard sscard-key
(integer) 0

sdiff [key1] [key2] … [keyn]

获取指定集合之间的差集,不存在的集合视为空集,取值标准是key1,返回结果来自key1,不是后面的集合,也不是所有集合的差集,返回值是差集成员列表

如果key1为空集或者不存在,返回的结果也是空集

127.0.0.1:6379> sadd sdiff-key a b c d e
(integer) 5
127.0.0.1:6379> sadd sdiff-key2 c d e g
(integer) 4
127.0.0.1:6379> sadd sdiff-key3 e g a
(integer) 3
127.0.0.1:6379> sadd sdiff-key4 a c
(integer) 2
127.0.0.1:6379> sdiff sdiff-key sdiff-key2 sdiff-key3 sdiff-key4
1) "b"

sdiffstore [destination-key] [key1] [key2] … [keyn]

作用类似sdiff,区别在于会将差集结果存储到destination-key,并且返回差集的元素数量

127.0.0.1:6379> exists sdiff-key5
(integer) 0
127.0.0.1:6379> sdiffstore sdiff-key5 sdiff-key sdiff-key2 sdiff-key3 sdiff-key4
(integer) 1
127.0.0.1:6379> smembers sdiff-key5
1) "b"

sinter [key1] [key2] … [keyn]

获取指定所有集合的交集,不存在的key视为空集,当给定集合中有一个空集时,返回的结果也是空集

127.0.0.1:6379> sadd sinter-key a b c d e
(integer) 5
127.0.0.1:6379> sadd sinter-key2 a b e g
(integer) 4
127.0.0.1:6379> sadd sinter-key3 a b d f h
(integer) 5
127.0.0.1:6379> sinter sinter-key sinter-key2 sinter-key3
1) "b"
2) "a"

sinterstore [destination-key] [key1] [key2] … [keyn]

作用与sinter类似,区别在于会将结果存储到destination-key,并且返回交集的元素数量

127.0.0.1:6379> sinterstore sinter-key5  sinter-key sinter-key2 sinter-key3
(integer) 2
127.0.0.1:6379> smembers sinter-key5
1) "b"
2) "a"

sismember [key] [member]

判断指定集合中是否包含成员member,存在返回,否则返回0

key不存在时视为空集

# 正常情况
127.0.0.1:6379> sadd sismember-key1 a b c d
(integer) 4
127.0.0.1:6379> sismember sismember-key1 a
(integer) 1
127.0.0.1:6379> sismember sismember-key1 e
(integer) 0

# key不存在
127.0.0.1:6379> exists sismember-key a
(integer) 0
127.0.0.1:6379> sismember sismember-key a
(integer) 0

smembers [key]

获取集合中的全部成员,不存在的集合视为空集

127.0.0.1:6379> sadd smembers-key a b c d e
(integer) 5
127.0.0.1:6379> smembers smembers-key
1) "d"
2) "b"
3) "c"
4) "a"
5) "e"

somve [source-key] [destination-key] [member]

将source-key的成员member移到destination-key中,成功返回1,失败返回0

如果source-key中没有该member,则返回0

如果destination-key已经包含该member,则仅仅只是移除source-key中的元素

如果source-key或者destination-key不是集合时返回一个错误

# 正常情况
127.0.0.1:6379> sadd smove-key a b c d e
(integer) 5
127.0.0.1:6379> smove smove-key smove-key2 a
(integer) 1
127.0.0.1:6379> smembers smove-key
1) "c"
2) "b"
3) "e"
4) "d"
127.0.0.1:6379> smembers smove-key2
1) "a"

# source-key不存在member
127.0.0.1:6379> smove smove-key smove-key3 g
(integer) 0
127.0.0.1:6379> smembers smove-key3
(empty list or set)

# source-key或者destination-key不是集合
127.0.0.1:6379> smove str-key smove-key4 a
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> smove smove-key str-key b
(error) WRONGTYPE Operation against a key holding the wrong kind of value

spop [key]

移除并返回集合中一个随机成员,返回被移除的成员,如果集合不存在或者为空返回nil

# 正常情况
27.0.0.1:6379> sadd spop-key a b c d e
(integer) 5
127.0.0.1:6379> spop spop-key
"e"
127.0.0.1:6379> spop spop-key
"a"
127.0.0.1:6379> smembers spop-key
1) "b"
2) "c"
3) "d"

# 集合不存在
127.0.0.1:6379> exists spop-key2
(integer) 0
127.0.0.1:6379> spop spop-key2
(nil)

# 集合为空
127.0.0.1:6379> sadd spop-key3 a
(integer) 1
127.0.0.1:6379> spop spop-key3
"a"
127.0.0.1:6379> smembers spop-key3
(empty list or set)
127.0.0.1:6379> spop spop-key3
(nil)

srandmember [key] [count]

返回集合中的随机成员,如果没有提供count参数,则返回一个成员,集合为空时返回nill;如果提供了count参数,那么返回一个数组,集合为空时返回空数组.

Redis 2.6版本开始时增加了count参数

count>0:如果count小于集合基数,则返回包含count个成员的数组,数组元素各不相同,如果count大于等于基数,则返回整个集合

count<0:返回一个数组,数组中元素可能会重复多次,长度为count绝对值

该命令和spop的区别在于只返回元素,不会对集合进行任何操作

127.0.0.1:6379> sadd srandmember-key a b c d e
(integer) 5
127.0.0.1:6379> smembers srandmember-key 
1) "d"
2) "b"
3) "c"
4) "a"
5) "e"

# 没有提供count参数,且集合不为空
127.0.0.1:6379> srandmember srandmember-key
"e"
127.0.0.1:6379> smembers srandmember-key 
1) "c"
2) "a"
3) "b"
4) "e"
5) "d"

# 没有提供count参数,且集合为空
127.0.0.1:6379> exists srandmember-key2
(integer) 0
127.0.0.1:6379> smembers srandmember-key2
(empty list or set)
127.0.0.1:6379> srandmember srandmember-key2
(nil)

# 提供count参数,且count>0,并小于集合成员数量
127.0.0.1:6379> srandmember srandmember-key 3
1) "b"
2) "c"
3) "a"

# 提供count参数,且count>0,并大于集合成员数量
127.0.0.1:6379> srandmember srandmember-key 8
1) "b"
2) "a"
3) "c"
4) "e"
5) "d"

# 提供count参数,且count>0,并等于集合成员数量
127.0.0.1:6379> srandmember srandmember-key 5
1) "b"
2) "a"
3) "c"
4) "e"
5) "d"

# 提供count参数,且count<0
127.0.0.1:6379> srandmember srandmember-key -8
1) "c"
2) "a"
3) "b"
4) "a"
5) "c"
6) "a"
7) "a"
8) "a"

# 提供count参数,且集合为空
127.0.0.1:6379> exists srandmember-key2
(integer) 0
127.0.0.1:6379> smembers srandmember-key2
(empty list or set)
127.0.0.1:6379> srandmember srandmember-key2 5
(empty list or set)

srem [key] [member1] [member2] … [membern]

移除集合中的一个或多个成员,返回成功移除的数量,不包含被忽略的成员

Redis 2.4 版本以前,srem只接受一个参数

127.0.0.1:6379> sadd srem-key a b c d e f 
(integer) 6
127.0.0.1:6379> smembers srem-key
1) "c"
2) "a"
3) "b"
4) "f"
5) "e"
6) "d"
127.0.0.1:6379> srem srem-key a b f g h
(integer) 3
127.0.0.1:6379> smembers srem-key
1) "c"
2) "e"
3) "d"

sunion [key1] [key2] [key3]

返回所有集合的并集,不存在的集合被视为空集

此处结果有问题,返回的集合数据不是全部的并集,并且结果数量根据key位置的不同发生变化

127.0.0.1:6379> sadd sunion-key a b
(integer) 2
127.0.0.1:6379> sadd sunion-key2 b c d
(integer) 3
127.0.0.1:6379> sadd sunion-key3 c e f
(integer) 3
127.0.0.1:6379> sunion suinon-key sunion-key2 sunion-key3
1) "f"
2) "c"
3) "b"
4) "e"
5) "d"
127.0.0.1:6379> sunion suinon-key3 sunion-key2 sunion-key
1) "b"
2) "d"
3) "a"
4) "c"

sunionstore [destination-key] [key1] [key2] [key3]

作用与sunion类似,区别在于会将结果储存到destination-key中,返回的是数量

127.0.0.1:6379> sunionstore sunion-key4 suinon-key sunion-key2 sunion-key3
(integer) 5
127.0.0.1:6379> smembers sunion-key4
1) "f"
2) "c"
3) "b"
4) "e"
5) "d"

sscan [key] [cursor] match [pattern] count [count]

迭代集合中键的元素

127.0.0.1:6379> sadd sscan-key hello hi haha redis world
(integer) 5
127.0.0.1:6379> smembers sscan-key
1) "hi"
2) "hello"
3) "haha"
4) "redis"
5) "world"
127.0.0.1:6379> sscan sscan-key 0
1) "0"
2) 1) "hi"
   2) "hello"
   3) "redis"
   4) "haha"
   5) "world"
127.0.0.1:6379> sscan sscan-key 0 match h* 
1) "0"
2) 1) "hi"
   2) "hello"
   3) "haha"
127.0.0.1:6379> sscan sscan-key 0 match h* count 2
1) "2"
2) 1) "hi"
   2) "hello"
Redis Redis

Redis命令-ZSetRedis命令-List