当前位置:首页 > 问答 > 正文

Redis里怎么直接拿Map里的值,快速查找不绕弯子方法分享

你想在Redis里直接拿Map(也就是哈希Hash)里的值,并且要快速不绕弯子,那最核心的方法就是使用HGETHMGET这两个命令,下面我就直接跟你说怎么用,以及一些让你用得更顺手的小技巧,这些方法在Redis的官方文档(来源:Redis Commands)里都有明确说明,我这里就是给你讲明白。

第一招:单点精准打击——HGET命令

当你明确知道你要找的是Map里的哪个字段(field)时,HGET就是最快的狙击枪,它的用法非常直接。

命令格式: HGET key field

  • key:就是你存放在Redis里那个Map的名字。
  • field:就是Map里面的一个键。

举个例子,假设你在Redis里存了一个叫user:1001的Map,里面放了用户的信息,比如有name(姓名)、age(年龄)、city(城市),现在你想快速查出这个用户的city是什么,直接这么干:

HGET user:1001 city

Redis会直接返回city对应的值,比如"Beijing",这个过程非常快,因为Redis是直接在内存里根据这个Map的key和field去定位的,没有多余的步骤,这就像你有一本通讯录,你直接翻到“张三”那一页看他的电话号码,而不是从第一页开始一页一页地找。

第二招:多点同时抓取——HMGET命令

如果你一次想从同一个Map里拿出好几个字段的值,比如你既想知道用户的城市,又想知道他的年龄,那用HGET就得执行两次命令,虽然每次也很快,但网络通信会花点时间,这时候,HMGET就派上用场了,它能让你一次命令就把所有想要的字段值都拿到。

命令格式: HMGET key field1 [field2 ...]

  • key:还是那个Map的名字。
  • field1, field2 ...:你可以跟上一个或多个你想要的字段名。

接着上面的例子,如果你想一次性获取user:1001nameage,就这样做:

HMGET user:1001 name age

Redis会返回一个列表,里面按顺序包含你指定的字段的值,比如可能是 ["张三", "28"],这样你就只用了一次网络来回,效率更高,这在你要同时展示用户多个信息的时候特别有用。

第三招:看清全貌——HGETALL命令

虽然你的重点是“快速查找不绕弯子”,但有时候你需要先知道这个Map里到底有什么,也就是看看它所有的字段和值,这时候就用HGETALL

命令格式: HGETALL key

  • key:Map的名字。

还是那个例子,执行:

HGETALL user:1001

Redis会把整个user:1001这个Map里所有的字段和值都以列表形式返回给你,["name", "张三", "age", "28", "city", "Beijing"],你先通过这个命令了解了Map的结构,以后就可以更精准地使用HGETHMGET了。

重要提醒: HGETALL在小Map上用起来很爽,但如果你的Map非常大,比如有几千几万个字段,那这个命令可能会因为返回数据太多而暂时“卡”住Redis一会儿(术语叫阻塞),影响其他操作,对于大Map,除非确实需要所有数据,否则慎用。

第四招:检查存在性——HEXISTS命令

有时候你并不关心字段的值具体是什么,你只关心这个字段在不在这个Map里,比如你想在给用户添加“昵称”前,先检查一下他是否已经设置过昵称了,这时候用HEXISTS最快。

命令格式: HEXISTS key field

  • key:Map的名字。
  • field:要检查的字段名。

例子: 检查user:1001是否有nickname这个字段。

HEXISTS user:1001 nickname

如果存在,Redis返回 (integer) 1;不存在则返回 (integer) 0,这比你先用HGET把值取出来再判断要更直接、更节省资源。

第五招:进阶技巧——组合使用管道(Pipeline)

这是一个能极大提升效率的“外挂”,尤其是在你需要连续执行很多个HGET或者HMGET的时候,Redis的命令通常是发一个请求,等一个回应,再发下一个,如果网络延迟高,连续操作就会慢。

管道(Pipeline)的功能(来源:Redis Pipeling)允许你把多个命令打包成一个请求发出去,然后一次性接收所有回应,这就像你要去仓库取十样东西,管道让你开一张取货单一次拿齐,而不是跑十趟。

比如你用编程语言操作Redis,要查10个不同用户Map里的city字段,不用管道,你要发起10次网络请求,用管道,你可以把这10个HGET命令打包,一次发送,一次读取结果,总时间可能缩短到原来的几分之一,具体怎么用管道,取决于你用的Redis客户端库,但这个思想你记着,是提速的利器。

总结一下最直接的方法:

  • 查一个字段的值:用 HGET
  • 查多个字段的值:用 HMGET
  • 看Map里都有啥:用小Map的 HGETALL
  • 只看字段在不在:用 HEXISTS
  • 要连续查很多次:考虑用 管道(Pipeline) 打包命令。

这些就是直接在Redis的Map里拿值的最快、最不绕弯子的方法了,你根据实际需要选着用就行。

Redis里怎么直接拿Map里的值,快速查找不绕弯子方法分享