版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
今天这几个命令与查询字段名有关,都是用来查询字段名是否存在的, HEXISTS 是用来查询散列表的一个字段是否存在的, HKEYS 是用来查询一个三列表中有哪些字段的, HSCAN 也是用来字段的,但不是一次就进行完整的遍历,而是分段进行遍历。
这篇笔记中的3个命令分别是 HEXISTS 、 HKEYS 、 HSCAN ,可以参考:
- 《Redis每日一练(11):DEL和EXISTS命令》 中的 EXISTS 命令
- 《Redis每日一练(14):KEYS、TYPE和RENAME命令》 中的 KEYS 命令
- 《Redis每日一练(15):SCAN命令》 中的 SCAN 命令
HEXISTS
- 最早出现版本:2.0.0
- 时间复杂度:O(1)
- 命令参数:HEXISTS key field
- 操作类型:hashes
- 官方文档
作用
查询散列表中的一个字段是否存在,当指定的字段存在时返回1,如果指定的键或者字段不存在返回0。
练习
先查询一个存在的字段,在查询一个不存在的字段,对比下返回值
127.0.0.1:6379> HSET users:101 name albert
(integer) 1
127.0.0.1:6379> HGET users:101 name
"albert"
127.0.0.1:6379> HEXISTS users:101 name
(integer) 1
127.0.0.1:6379> HGET users:101 age
(nil)
127.0.0.1:6379> HEXISTS users:101 age
(integer) 0
127.0.0.1:6379> GET users:102
(nil)
127.0.0.1:6379> HEXISTS users:102 name
(integer) 0
127.0.0.1:6379>
HKEYS
- 最早出现版本:2.0.0
- 时间复杂度:O(N)
- 命令参数:HKEYS key
- 操作类型:hashes
- 官方文档
作用
其实这个命令我一开始是对照 KEYS 命令学习的,但是看了它的说明感觉是搞错了,应该是对照着 HGETALL 或者 HVALS 来学习,命令 HVALS 是获取一个散列表所有字段对应的值,而 HKEYS 命令是获取一个散列表中所有字段的,这个命令后面只能跟散列表的键,不能像 KEYS 命令一样后面加匹配串,这个需要注意下,返回值是一个列表。
练习
返回一个散列表中的所有字段名,也可以使用 HVALS 和 HGETALL 命令对比一下:
127.0.0.1:6379> HMSET users:101 name albert age 18 weight 61
OK
127.0.0.1:6379> HKEYS users:101
1) "name"
2) "age"
3) "weight"
127.0.0.1:6379> HGETALL users:101
1) "name"
2) "albert"
3) "age"
4) "18"
5) "weight"
6) "61"
127.0.0.1:6379> HVALS users:101
1) "albert"
2) "18"
3) "61"
127.0.0.1:6379>
HSCAN
- 最早出现版本:2.8.0
- 时间复杂度:O(1)(完整遍历是O(N))
- 命令参数:HSCAN key cursor [MATCH pattern] [COUNT count]
- 操作类型:hashes
- 官方文档
作用
这个命令的官方文档相当简洁,只写了一句去看 SCAN 命令的文档就行了,而对于这个 SCAN 命令之前因为文档太长,我专门花了一篇笔记的篇幅来写这个命令。
这个命令的作用就是 KEYS 命令查询所有的键时会非常耗时,导致服务器在此期间无法提供服务,所以可以使用 SCAN 命令来分段命令,这个命令一开始传入游标参数0,然后返回值分为两部分,第一部分是下次调用时可用的游标,第二部分是查出的键的列表,当第一部分的游标是0时说明已经完全遍历了一遍。
HSCAN 命令的使用方式和 SCAN 命令的使用方式基本一致,只是 SCAN 命令是用来查询数据库中所有的键的,而 HSCAN 命令是用来查询一个散列表的所有字段和对应值的,这一点和 HGETALL 很像。
练习
查询一个较少的字段的散列表:
127.0.0.1:6379> HGETALL users:101
1) "name"
2) "albert"
3) "age"
4) "18"
5) "weight"
6) "61"
127.0.0.1:6379> HSCAN users:101 0
1) "0"
2) 1) "name"
2) "albert"
3) "age"
4) "18"
5) "weight"
6) "61"
127.0.0.1:6379>
上面查询字段较少的散列表,可以发现第一次就返回了0,说明一次就完成了完整的遍历,下面再看一次字段较多的情况,然后指定每次查询的数量:
127.0.0.1:6379> HGETALL users:103
1) "name"
2) "tom"
3) "age"
4) "18"
5) "a"
6) "1"
7) "b"
8) "2"
9) "c"
10) "3"
11) "d"
12) "4"
13) "e"
14) "5"
15) "f"
16) "6"
127.0.0.1:6379> HSCAN users:103 0 COUNT 6
1) "0"
2) 1) "name"
2) "tom"
3) "age"
4) "18"
5) "a"
6) "1"
7) "b"
8) "2"
9) "c"
10) "3"
11) "d"
12) "4"
13) "e"
14) "5"
15) "f"
16) "6"
127.0.0.1:6379>
有没有发现这个 COUNT 命令没有生效,这个就很神奇了,文档中提到这个 COUNT 选项只是提供一种暗示,但是它经常生效,有趣的是这个例子中这个参数就没有生效,知道这种情况就可以了。
总结
- HEXISTS 命令可以用来判断散列表的一个字段是否存在,存在返回1,失败返回0。
- HKEYS 命令会返回一个散列表的所有字段名,返回值是一个列表。
- HSCAN 命令更像是一个 HGETALL 命令的分段版本,可以避免 Redis 长时间卡顿问题。
2019-12-8 19:34:33




