版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
今天开始学习操作集合 sets 类型的命令,集合的概念最早是在数学课本中学到的,整数的集合,有理数的集合,无理数的集合等等,集合有一个特点就是没有重复的元素,很多时候可以利用这个特点进行去重操作,比如统计几个参赛项目中一共有多少个运动员参加,因为一个运动员可能参加多个项目,这时候遍历每个项目参加的运动员插入到集合中,最后集合中的元素个数就是参加各个项目的运动员总数。
这篇笔记中的3个命令分别是 SADD 、 SMEMBERS 、SCARD ,之前没有这几种类似的操作,不过可以参考一下但列表的插入和散列表的显示所有元素:
- 《Redis每日一练(21):LPUSH和LRANGE命令》 中的 LPUSH 命令
- 《Redis每日一练(17):HMSET、HMGET、HVALS、HGETALL命令》 中的 HVALS 命令
- 《Redis每日一练(18):HSETNX、HSTRLEN和HLEN命令》 中的 HLEN 命令
SADD
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:SADD key member [member …]
- 操作类型:sets
- 官方文档
作用
SADD 命令是向集合中添加元素,虽然不是列表,但是可以类比 LPUSH 命令像列表中插入元素,而 SADD 可以向集合中添加一个元素,这个集合没有位置的概念,就是添加到集合中,没有头部、尾部、索引这些信息。
集合内不会包含重复的元素,如果添加的元素在原集合中不存在,则可以正常添加,否则不会产生任何操作。
如果指定的键为空,这时会先创建一个空的集合将元素插入,如果指定的键不是集合类型会给出错误信息,插入成功时返回1,不成功时返回0。
当 Redis 版本大于等于2.4时,该命令支持一次插入多个元素,返回成功插入的元素个数,之前版本每次只能插入一个元素。
练习
对一个空的键当成集合插入一个元素,然后插入多个元素,查看返回值:
127.0.0.1:6379> GET nset
(nil)
127.0.0.1:6379> SADD nset 1
(integer) 1
127.0.0.1:6379> SADD nset 1
(integer) 0
127.0.0.1:6379> SADD nset 1 6 9 0
(integer) 3
127.0.0.1:6379>
当对一个不是集合类型的键使用 SADD 命令时会给出错误信息:
127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> SADD name 1 2 3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
SMEMBERS
- 最早出现版本:1.0.0
- 时间复杂度:O(N)
- 命令参数:SMEMBERS key
- 操作类型:sets
- 官方文档
作用
刚刚看了向集合中插入元素的命令,要想查看集合内所有的元素就会用到 SMEMBERS 命令,该命令以列表形式返回集合中的所有元素,当指定的键不是集合类型时会给出报错信息。
练习
多次使用 SADD 命令创建一个多元素的集合,然后使用 SMEMBERS 命令查看集合中有哪些元素:
127.0.0.1:6379> GET nset
(nil)
127.0.0.1:6379> SMEMBERS nset
(empty list or set)
127.0.0.1:6379> SADD nset 1 20 3 5
(integer) 4
127.0.0.1:6379> SADD nset 20 5 8
(integer) 1
127.0.0.1:6379> SADD nset 8 12 16
(integer) 2
127.0.0.1:6379> SMEMBERS nset
1) "1"
2) "3"
3) "5"
4) "8"
5) "12"
6) "16"
7) "20"
127.0.0.1:6379>
当指定的键不是一个集合类型的时候会给出类型不匹配的错误消息:
127.0.0.1:6379> SET name albert
OK
127.0.0.1:6379> SMEMBERS name
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>
SCARD
- 最早出现版本:1.0.0
- 时间复杂度:O(1)
- 命令参数:SCARD key
- 操作类型:sets
- 官方文档
作用
SCARD 命令会返回集合中元素的个数,是 set cardinality 的缩写,这个命令居然没使用常用的 LEN 或者 SIZE ,而使用了一个参数 cardinality ,查询后发现这是一个数学名词,叫做集的势,按我的理解应该就是集合中元素的个数。
当指定的键不存在时返回0,当指定的键不是集合类型事会报错。
练习
多次使用 SADD 命令创建一个多元素的集合,然后使用 SCARD 命令查看集合中元素个数:
127.0.0.1:6379> GET nset
(nil)
127.0.0.1:6379> SCARD nset
(integer) 0
127.0.0.1:6379> SADD nset 1 3 6
(integer) 3
127.0.0.1:6379> SADD nset 3 5 8
(integer) 2
127.0.0.1:6379> SMEMBERS nset
1) "1"
2) "3"
3) "5"
4) "6"
5) "8"
127.0.0.1:6379> SCARD nset
(integer) 5
127.0.0.1:6379>
总结
- SADD 命令可以向集合中插入不重复的元素,返回成功插入的元素的个数。
- SMEMBERS 命令可以查询集合中所有的元素,将结果以列表形式返回。
- SCARD 命令可以返回集合元素的个数,当指定的键不存在时返回0。
2019-12-17 11:35:29