暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(17):HMSET、HMGET、HVALS、HGETALL命令

原创 AlbertS 2019-12-17
5124

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

今天继续学习操作 hashs 类型的命令,散列表这种类型既可以实现按字段名存储,又可以避免全部定义成字符串结构导致的“很散”的情况,同样是那么多数据项,散列表可以将一些属性打包对应到散列表中的一个键上,这很像关系数据库的设计方式,整个散列表对应一个数据表,散列中的一个个键对应关系表中的一行行数据,每个键中的对应的字段数据又对应了关系表中的一列列。

可以类比关系表来学习,但是操作方法却不太一样,为了使用散列表,我们需要获取数据或者设置数据,有时需要一次性设置和读取多个数据,今天的这几个命令就是一次操作多个数据的,接下来看一下。

这篇笔记中的4个命令分别是 HMSET 、 HMGET 、 HVALS 、 HGETALL ,可以参考:

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)’。

总结

  1. HMSET 命令可以一次性设置多个字段的值,但是在 4.0.0 版本之后可以被命令 HSET 代替了。
  2. HMGET 命令可以一次性获得多个字段对应的值,得到的值会以列表的形式返回。
  3. HVALS 命令可以获取散列表中所有字段对应的值,这些值以列表的形式返回。
  4. HGETALL 命令可以返回单列表中所有字段和其对应的值,字段名和对应的值依次出现在返回列表中。

2019-12-7 12:32:40

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论