Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 集合 相关的命令,也就是关于 Sets 相关的命令,如下图。
上图中用红色圈中的部分,就是关于 集合 相关的命令。如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。
127.0.0.1:6379> help @set
在按下回车后,可以看到相应分类命令的说明,如下图。
图中就是部分关于 Sets 相关的部分命令。
常用 Sets 相关命令
Sets 数据类型是 Key 对应的 Value 的类型,在 Redis 中所有的 Key 都是字符串,所谓的数据类型表示的是 Value 的类型。在 Sets 中的 Value 是一个集合,集合是无序的,不可以重复的。
为了大家能够直接复制命令进行测试,下面我就不截图了。
1、sadd
添加一个或者多个元素到集合里,命令格式如下:
sadd key member [member ...]
例子如下:
127.0.0.1:6379> sadd lang java c++ (integer) 2
sadd 命令中 lang 是 key,而 java 和 c++ 是两个元素,或者也可以称为两个值,两个成员。
Sets 和 List 类似,它的 key 对应多个 value,不像 String 类型,一个 key 对应一个 value。
Sets 集合是不可以重复的,因此添加相同的元素会失败,测试如下:
127.0.0.1:6379> sadd lang java (integer) 0
2、scard
获取集合中的元素个数
127.0.0.1:6379> scard lang (integer) 2
3、sismember
判断一个值是否在指定的集合中
127.0.0.1:6379> sismember lang java (integer) 1 127.0.0.1:6379> sismember lang python (integer) 0
4、smembers
获取指定集合中的所有元素
127.0.0.1:6379> smembers lang 1) "java" 2) "c++"
5、smove
移动集合中的一个元素到另外一个集合中
127.0.0.1:6379> smove lang otherlang c++ (integer) 1 127.0.0.1:6379> smembers otherlang 1) "c++"
注意:
一次只能移动一个元素
127.0.0.1:6379> smove lang otherlang c++ java (error) ERR wrong number of arguments for 'smove' command
如果要移动元素不存在,也是移动不到另外一个集合当中的
127.0.0.1:6379> smove lang otherlang python (integer) 0
6、spop
返回指定集合中的一个元素,并删除,它的指令格式如下:
spop key [count]
在测试前再添加几个元素
127.0.0.1:6379> sadd lang python php ruby lua scala (integer) 5
查看集合中的元素
127.0.0.1:6379> smembers lang 1) "c++" 2) "java" 3) "php" 4) "ruby" 5) "scala" 6) "python" 7) "lua"
获取一个值:
127.0.0.1:6379> spop lang 1 1) "scala"
可以看到返回的是第五个值,获取的这个值已经从集合中删除,查看集合中的元素
127.0.0.1:6379> smembers lang 1) "java" 2) "php" 3) "ruby" 4) "c++" 5) "python" 6) "lua"
获取两个值
127.0.0.1:6379> spop lang 2 1) "c++" 2) "python"
可以看到返回了两个值,且返回的这两个值已经从集合中删除了,查看集合中的元素
127.0.0.1:6379> smembers lang 1) "java" 2) "php" 3) "ruby" 4) "lua"
可以看到,获取的值是随机的
目前集合中还有四个值,我们这次使用 spop 来获取五个元素
127.0.0.1:6379> spop lang 5 1) "ruby" 2) "php" 3) "java" 4) "lua" 127.0.0.1:6379> smembers lang (empty list or set)
从上面可以看出,虽然我们打算获取 5 个元素,但是实际只有 4 个,再获取完最后四个元素后,lang 集合中已经没有值了。
7、srandmember
从集合中随机返回若干元素,它的指令格式和 spop 类似,它只返回元素而不从集合中删除
srandmember key [count]
在测试之前,先添加若干个元素
127.0.0.1:6379> sadd lang java c++ php python lua ruby asm (integer) 7 127.0.0.1:6379> smembers lang 1) "c++" 2) "ruby" 3) "java" 4) "php" 5) "asm" 6) "python" 7) "lua"
测试 srandmember 命令
127.0.0.1:6379> srandmember lang 1 1) "lua" 127.0.0.1:6379> srandmember lang 2 1) "lua" 2) "c++" 127.0.0.1:6379> srandmember lang 5 1) "ruby" 2) "php" 3) "c++" 4) "python" 5) "lua" 127.0.0.1:6379> srandmember lang 1 1) "java"
可以看到,每次返回的元素是不同的
8、srem
从集合中删除一个或多个元素,它的格式如下:
srem key member [member ...]
127.0.0.1:6379> srandmember lang 1 1) "java" 127.0.0.1:6379> srem lang java (integer) 1 127.0.0.1:6379> srem lang c++ python (integer) 2 127.0.0.1:6379> smembers lang 1) "ruby" 2) "php" 3) "asm" 4) "lua"
9、sinter
获得两个集合的交集,这里的交集就是数学上的交集,也就是两个集合拥有的相同的元素,指令格式如下:
sinter key [key ...]
首先,我们重新来定义两个集合。
127.0.0.1:6379> sadd zhangsan java c++ python ruby (integer) 4 127.0.0.1:6379> sadd lisi python c java php (integer) 4
这里有两个集合,分别是 zhangsan 和 lisi,现在来看 zhangsan 和 lisi 有的共同的元素。
127.0.0.1:6379> sinter zhangsan lisi 1) "java" 2) "python"
sinter 可以得到多个集合的交集
10、sunion
获得两个集合的并集,这里的并集就是数学上的并集,也就是两个集合的所有元素,指令格式如下:
sunion key [key ...]
接着用 sunion 的例子来看两个集合的并集
127.0.0.1:6379> sunion zhangsan lisi 1) "c" 2) "ruby" 3) "java" 4) "php" 5) "c++" 6) "python"
sunion 可以得到多个集合的并集
11、sdiff
获取两个集合的差集,这里的差集是数学上的差集,指令格式如下:
sdiff key [key ...]
差集和交集、并集不太相同,看例子:
127.0.0.1:6379> sdiff zhangsan lisi 1) "ruby" 2) "c++"
zhangsan 和 lisi 的差集,也就是 zhangsan 中有的,而 lisi 中没有的,这就是 zhangsan 和 lisi 的差集。
再来看下面的例子:
127.0.0.1:6379> sdiff lisi zhangsan 1) "c" 2) "php"
这个例子当中,sdiff 后面跟着 lisi 这个集合,因此是 lisi 和 zhangsan 的差集,也就是 lisi 中有的,而 zhangsan 中没有的。
sdiff 可以得到多个集合的差集
12、sinterstore
获取两个集合的交集,并将结果保存到一个 key 中
这个命令和 sinter 命令类似,只是它会把交集的结果保存到一个 key 中进行存储,其指令格式如下:
sinterstore destination key [key ...]
127.0.0.1:6379> sinterstore result zhangsan lisi (integer) 2 127.0.0.1:6379> smembers result 1) "java" 2) "python"
13、sunionstore
获取两个集合的并集,并将结果保存到一个 key 中
14、sdiffstore
获取两个集合的差集,并将结果保存到一个 key 中
总结
Redis 的集合类型提供的命令还是比较多的,它不但可以当作一个集合来用,它的 交集、并集 和 差集 还可以实现一些较为有意思的功能。
Redis 常用的几种基本数据类型总结完成后,我会再逐步的梳理 Redis 的各种应用场景,希望大家可以喜欢。