版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
今天继续学习操作 hashs 类型的命令,散列表这种类型既可以实现按字段名存储,又可以避免全部定义成字符串结构导致的“很散”的情况,同样是那么多数据项,散列表可以将一些属性打包对应到散列表中的一个键上,这很像关系数据库的设计方式,整个散列表对应一个数据表,散列中的一个个键对应关系表中的一行行数据,每个键中的对应的字段数据又对应了关系表中的一列列。
可以类比关系表来学习,但是操作方法却不太一样,为了使用散列表,我们需要获取数据或者设置数据,有时需要一次性设置和读取多个数据,今天的这几个命令就是一次操作多个数据的,接下来看一下。
这篇笔记中的4个命令分别是 HMSET 、 HMGET 、 HVALS 、 HGETALL ,可以参考:
- 《Redis每日一练(04):SETEX、SETNX、PSETEX、MSET、MSETNX命令》 中的 MSET 命令
- 《Redis每日一练(05):MGET和GETSET命令》 中的 MGET 命令
HMSET
- 最早出现版本:2.0.0
- 时间复杂度:O(N)
- 命令参数:HMSET key field value [field value …]
- 操作类型:hashes
- 官方文档
作用
HMSET 这个命令就是一次性设置多个字段值的,返回一个简单字符串"OK"表示设置成功,看前来是不是很熟悉,如果之前学习了 HSET 命令就会知道,自从 4.0.0 版本以后, HSET 命令也可以一次性设置多个字段,换句话说 HMSET 在 4.0.0 版本之后基本被废弃,马上就下岗了。
练习
因为在 3.2.100 这个版本的 HMSET 还能用,我们直接使用这个命令设置两个字段试试:
127.0.0.1:6379> GET users:101
(nil)
127.0.0.1:6379> HMSET users:101 name albert age 18
OK
127.0.0.1:6379> HMSET users:101 name albert age 18
OK
127.0.0.1:6379> HGET users:101 name
"albert"
127.0.0.1:6379> HGET users:101 age
"18"
127.0.0.1:6379>
通过上面这个例子可以看出,HMSET 命令要比 4.0.0 版本的 HSET 命令要弱,不管设置的字段是否存在都会返回"OK",而 HSET 命令可以返回新增加的个数,所以建议使用新版本的 Redis 时要用 HSET 命令代替 HMSET 命令。
HMGET
- 最早出现版本:2.0.0
- 时间复杂度:O(N)
- 命令参数:HMGET key field [field …]
- 操作类型:hashes
- 官方文档
作用
上面讲的是一次设置散列表的多个字段,那么接下来看一下使用 HMGET 命令一次性取多个字段的数值,需要注意的是 HGET 命令每次都只能取一个字段值,而 HMGET 命令可以一次取多个,暂时还不能被 HGET 命令代替,未来可不一定。
练习
使用 HMSET 设置字段后,再使用 HMGET 命令读取设置的值,会发现返回了一个列表:
127.0.0.1:6379> HMSET users:101 name albert age 18 weight 60
OK
127.0.0.1:6379> HMGET users:101
(error) ERR wrong number of arguments for 'hmget' command
127.0.0.1:6379> HMGET users:101 name age weight
1) "albert"
2) "18"
3) "60"
127.0.0.1:6379>
查看上面的测试代码会发现,一开始我使用 HMSET 的时候因为没有加字段名导致报错了,这是理解错误,因为当时想的是获取所有字段的数据,但是这个命令是无法实现的,获取所有字段的数据可以使用命令 HVALS ,接下来就会看到了。
HVALS
- 最早出现版本:2.0.0
- 时间复杂度:O(N)
- 命令参数:HVALS key
- 操作类型:hashes
- 官方文档
作用
这个命令就是可以一次性的获取散列表一个键的所有值,注意这个地方获取的只有值,而没有对应的字段名字,返回值以列表的形式给出。
练习
使用 HSET 命令设置多个字段值,然后再用 HVALS 获取所有的字段对应的数据:
27.0.0.1:6379> GET users:101
(nil)
127.0.0.1:6379> HSET users:101 name albert
(integer) 1
127.0.0.1:6379> HSET users:101 age 18
(integer) 1
127.0.0.1:6379> HSET users:101 weight 61
(integer) 1
127.0.0.1:6379> HVALS users:101
1) "albert"
2) "18"
3) "61"
127.0.0.1:6379>
HGETALL
- 最早出现版本:2.0.0
- 时间复杂度:O(N)
- 命令参数:HGETALL key
- 操作类型:hashes
- 官方文档
作用
前面的 HVALS 命令只能获取散列表的所有值,要想获取字段需要使用 HGETALL 命令,这个命令可以返回散列表类型的所有字段和值,返回的内容是一个列表,字段名和对应的数据依次排列在列表中。
练习
使用 HSET 命令设置多个字段值,然后再用 HGETALL 获取所有的字段和其对应的数据:
127.0.0.1:6379> GET users:101
(nil)
127.0.0.1:6379> HSET users:101 name albert
(integer) 1
127.0.0.1:6379> HSET users:101 age 18
(integer) 1
127.0.0.1:6379> HSET users:101 weight 61
(integer) 1
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> HGETALL users:103
(empty list or set)
127.0.0.1:6379>
测试结果发现,散列表的字段和对应的值依次出现在返回的列表中,当指定查找的键不存在时会返回’(empty list or set)’。
总结
- HMSET 命令可以一次性设置多个字段的值,但是在 4.0.0 版本之后可以被命令 HSET 代替了。
- HMGET 命令可以一次性获得多个字段对应的值,得到的值会以列表的形式返回。
- HVALS 命令可以获取散列表中所有字段对应的值,这些值以列表的形式返回。
- HGETALL 命令可以返回单列表中所有字段和其对应的值,字段名和对应的值依次出现在返回列表中。
2019-12-7 12:32:40