【Redis学习系列】Set类型

/ Redis / 没有评论 / 1270浏览

Set类型

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

smembers

smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合。

127.0.0.1:6379> smembers name
1) "cff"
2) "tdt"
3) "huzd"
4) "zzd"

sadd

sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。当集合 key 不是集合类型时,返回一个错误。

127.0.0.1:6379> sadd name huzd huzd cff zzd #huzd出现两次第二次被忽略
(integer) 3
127.0.0.1:6379> smembers name #查看set成员变量
1) "cff"
2) "huzd"
3) "zzd"
127.0.0.1:6379> sadd name cff tdt
(integer) 1
127.0.0.1:6379> smembers name
1) "cff"
2) "tdt"
3) "huzd"
4) "zzd"

scard

scard 命令返回集合中元素的数量。当集合 key 不存在时,返回 0 。

127.0.0.1:6379> scard st3
(integer) 0
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> scard name
(integer) 4

sdiff

sdiff 命令返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。

差集的结果来自前面的 FIRST_KEY ,而不是后面的 OTHER_KEY1,也不是整个 FIRST_KEY OTHER_KEY1..OTHER_KEYN 的差集。

127.0.0.1:6379> sadd k1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd k2 b c e
(integer) 3
127.0.0.1:6379> sadd k3 c d e
(integer) 3
127.0.0.1:6379> sdiff k1 k2 k3
1) "f"
2) "a"

sdiffstore

sdiffstore 命令将给定集合之间的差集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。

127.0.0.1:6379> sadd k1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd k2 b c e 
(integer) 3
127.0.0.1:6379> sadd k3 c d e
(integer) 3
127.0.0.1:6379> sdiffstore kk k1 k2 k3
(integer) 2
127.0.0.1:6379> smembers kk
1) "f"
2) "a"

sinter

sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

127.0.0.1:6379> smembers k1
1) "b"
2) "c"
3) "d"
4) "f"
5) "e"
6) "a"
127.0.0.1:6379> smembers k2
1) "b"
2) "e"
3) "c"
127.0.0.1:6379> smembers k3
1) "e"
2) "c"
3) "d"
127.0.0.1:6379> sinter k1 k2 k3
1) "e"
2) "c"

sinterstore

sinterstore 命令将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖。

127.0.0.1:6379> sinterstore k4 k1 k2 k3 #将合集保存在k4中
(integer) 2
127.0.0.1:6379> smembers k4
1) "c"
2) "e"

sismember

sismember 命令判断成员元素是否是集合的成员。如果成员元素是集合的成员,返回 1 。 如果成员元素不是集合的成员,或 key 不存在,返回 0 。

127.0.0.1:6379> sismember k1 a
(integer) 1
127.0.0.1:6379> sismember k1 aaa
(integer) 0

smove

smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合。

SMOVE 是原子性操作。

127.0.0.1:6379> smembers k1 #查看k1元素
1) "b"
2) "c"
3) "d"
4) "f"
5) "e"
6) "a"
127.0.0.1:6379> smembers k2 #查看k2元素
1) "b"
2) "e"
3) "c"
127.0.0.1:6379> smove k1 k2 a #将元素a从 k1 移往 k2
(integer) 1
127.0.0.1:6379> smembers k1
1) "b"
2) "c"
3) "d"
4) "f"
5) "e"
127.0.0.1:6379> smembers k2
1) "b"
2) "e"
3) "c"
4) "a"
127.0.0.1:6379> smove k9 k2 22 #k9不存在
(integer) 0

spop

spop 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素。

该命令类似 Srandmember 命令,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动

127.0.0.1:6379> sadd name huzd zhouyg zhaoqx zhangbq
(integer) 4
127.0.0.1:6379> spop name
"zhangbq"
127.0.0.1:6379> smembers name
1) "zhaoqx"
2) "zhouyg"
3) "huzd"
127.0.0.1:6379> spop name 2 #随机移除2个
1) "zhaoqx"
2) "huzd"
127.0.0.1:6379> smembers name
1) "zhouyg"

srandmember

srandmember 命令用于返回集合中的一个随机元素。

从 Redis 2.6 版本开始, Srandmember 命令接受可选的 count 参数:

该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 Srandmember 则仅仅返回随机元素,而不对集合进行任何改动。

127.0.0.1:6379> smembers k1 #查看k1元素
1) "b"
2) "c"
3) "d"
4) "f"
5) "e"
127.0.0.1:6379> srandmember k1 1 #随机返回k1的一个元素
1) "b"
127.0.0.1:6379> srandmember k1 3 #随机返回k1的三个元素
1) "b"
2) "f"
3) "e"
127.0.0.1:6379> srandmember k1 5 #随机返回k1的5个元素
1) "f"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> srandmember k1 9 #随机返回k1的9个元素,此时只返回全部集合
1) "f"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> srandmember k1 -5 #随机返回k1的-5个元素,此时可能会返回重复值
1) "b"
2) "f"
3) "b"
4) "c"
5) "f"
127.0.0.1:6379> srandmember k1 -9
1) "e"
2) "c"
3) "b"
4) "d"
5) "c"
6) "f"
7) "f"
8) "d"
9) "e"
127.0.0.1:6379> srandmember k1 -2
1) "e"
2) "d"

srem

srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。当 key 不是集合类型,返回一个错误。

127.0.0.1:6379> smembers k1
1) "b"
2) "c"
3) "d"
4) "f"
5) "e"
127.0.0.1:6379> srem k1 a b c
(integer) 2
127.0.0.1:6379> smembers k1
1) "d"
2) "f"
3) "e"

sunion

sunion 命令返回给定集合的并集。不存在的集合 key 被视为空集。

127.0.0.1:6379> smembers k1
1) "d"
2) "f"
3) "e"
127.0.0.1:6379> smembers k2
1) "b"
2) "e"
3) "c"
4) "a"
127.0.0.1:6379> sunion k1 k2 k100
1) "e"
2) "d"
3) "b"
4) "c"
5) "f"
6) "a"

sunionstore

sunionstore 命令将给定集合的并集存储在指定的集合 destination 中。如果 destination 已经存在,则将其覆盖。

127.0.0.1:6379> sunionstore k9 k1 k2
(integer) 6
127.0.0.1:6379> smembers k9
1) "e"
2) "d"
3) "b"
4) "c"
5) "f"
6) "a"

sscan

sscan 命令用于迭代集合中键的元素。

redis Sscan 命令基本语法如下:

SSCAN key cursor [MATCH pattern] [COUNT count]
127.0.0.1:6379> sadd name huzd zhouyg zhaoqx wuzf chenrr liujp jiangjw
(integer) 7
127.0.0.1:6379> sscan name 0 MATCH huzd
1) "0"
2) 1) "huzd"
127.0.0.1:6379> sscan name 0 MATCH *u*
1) "0"
2) 1) "zhouyg"
   2) "wuzf"
   3) "huzd"
   4) "liujp"
127.0.0.1:6379> sscan name 0 MATCH *u* COUNT 2
1) "5"
2) 1) "zhouyg"
   2) "wuzf"
127.0.0.1:6379> sscan name 5 MATCH *u* COUNT 2
1) "0"
2) 1) "huzd"
   2) "liujp"