想要从Redis哈希中只取字段值,不取字段名,该用哪个命令?HVALS就是专为这个需求设计的。它接受一个key参数,返回该哈希表中所有字段的值列表。如果key不存在,返回空列表;如果key类型不是哈希,返回类型错误。这个命令在需要批量获取哈希字段值的场景中非常高效,但也要注意它的复杂度是O(N),N为哈希字段数量。

HVALS命令基础用法
HVALS命令的语法非常简单,只有一条参数:HVALS key。其中key指向一个Redis哈希表。如果key对应的数据类型不是哈希,Redis会返回一个类型错误。如果key不存在,则返回一个空数组。命令执行时会遍历哈希表的所有字段,并将这些字段对应的值按字段在哈希表中的内部存储顺序返回。
下面通过Redis CLI演示一下完整流程。先使用HSET命令创建一个包含三个字段的用户哈希,再调用HVALS获取所有字段值:
127.0.0.1:6379> HSET user:1001 name "Alice" age "30" city "Beijing" (integer) 3 127.0.0.1:6379> HVALS user:1001 1) "Alice" 2) "30" 3) "Beijing"
可以看到返回结果是一个数组,元素的顺序与HKEYS命令返回的字段名顺序一一对应。不过需要注意,Redis并不保证HVALS的返回顺序在不同调用之间是稳定的,尤其是在哈希表发生添加、删除操作后,内部存储顺序可能会变化。如果业务依赖固定顺序,最好先取得字段名再自行排序,或者使用有序的结构如ZSet。
HVALS的时间复杂度为O(N),N为哈希中字段的数量。对于小型哈希来说,执行速度非常快;但对于拥有数十万甚至更多字段的大型哈希,单次HVALS可能会消耗较多CPU时间,并阻塞Redis的单线程事件循环,这点在后面性能部分会详细讨论。
HVALS与HGETALL、HKEYS的对比
Redis提供了多个获取哈希内容的命令,HVALS只是其中之一。最常用的还有HGETALL和HKEYS。HGETALL会返回哈希表中所有的字段和值,以“字段1, 值1, 字段2, 值2”这样的形式交替返回;HKEYS只返回所有字段名,不包含值;HVALS则只返回所有字段值,不包含字段名。这三者都是O(N)复杂度,但返回的数据量不同。
如果只需要字段值,HVALS可以显著减少网络传输的数据量,因为它返回的数组长度只有HGETALL的一半。例如一个哈希有100个字段,HGETALL返回200个元素,而HVALS只返回100个元素。在带宽敏感或客户端解析开销大的场景下,优先选择HVALS或HKEYS会更有优势。
另一个容易被忽略的命令是HMGET,它可以获取指定字段的值,而不是全部字段。如果业务只需要部分字段的值,使用HMGET可以避免读取不必要的数据。例如只需要用户的姓名和年龄,就可以执行HMGET user:1001 name age,这样只返回两个值,而HVALS会返回全部三个。选择哪个命令取决于具体需求:需要全部值用HVALS,需要全部字段名用HKEYS,需要完整映射用HGETALL,需要指定字段用HMGET。
HVALS的典型应用场景
HVALS特别适合那些只需要哈希字段值列表的业务。比如一个商品哈希存储了商品的各种属性,而前端展示时只需要属性值的数组,不关心字段名,此时就可以直接用HVALS取出所有值,再交给模板引擎渲染。又或者做数据导出时,只需要把哈希里的值按顺序写入CSV的一行,用HVALS会比HGETALL少处理一半的元素。
在编程语言客户端中,HVALS的调用也很直观。以Python的redis-py为例:
import redis
client = redis.Redis(host='localhost', port=6379, decode_responses=True)
client.hset('product:2001', mapping={'name': 'Laptop', 'price': '6999', 'stock': '120'})
values = client.hvals('product:2001')
print(values) # 输出:['Laptop', '6999', '120']
上述代码先写入三个字段,再用hvals()方法获取所有值,返回一个Python列表。如果后续需要对值做数值计算,可以使用列表推导式将字符串转为整数,例如nums = [int(v) for v in values if v.isdigit()]。实际项目中,HVALS经常和管道(pipeline)结合,批量读取多个哈希的值列表,减少往返延迟。
大哈希下的性能风险与替代方案
前面提到HVALS是O(N)命令,它会一次性把整个哈希的所有字段值都取出来。当哈希字段数量特别大时,比如一个哈希存储了上百万个字段,HVALS的执行时间可能达到数百毫秒甚至秒级。由于Redis使用单线程处理命令,这段时间内其他客户端的所有请求都会被阻塞,导致整体响应变慢。因此,在生产环境中应尽量避免对大哈希使用HVALS、HGETALL这类全量返回的命令。
针对大哈希,推荐使用HSCAN命令进行增量迭代。HSCAN每次只返回少量字段和值,并附带一个游标,客户端可以循环调用直到游标为0。虽然单次HSCAN返回的数据中既有字段名也有值,但可以在客户端只提取值部分,达到类似HVALS的效果,同时不会长时间阻塞Redis。下面是一个HSCAN的调用示例:
127.0.0.1:6379> HSCAN large_hash 0 COUNT 100 1) "1024" 2) 1) "field1" 2) "value1" 3) "field2" 4) "value2" ...
每次调用后检查返回的游标,如果游标不为0则继续下一次HSCAN。在Python中可以写一个循环,把返回结果中的奇偶索引元素筛选出来,得到所有值。对于超大哈希,还可以考虑在数据写入时进行分片,将一个大哈希拆成多个小哈希,按一定规则路由,这样每个哈希的字段数量可控,HVALS也能安全使用。
总之,HVALS是一个简单直接的命令,适合中小规模哈希的值提取。理解它的返回值、复杂度以及与其他哈希命令的差异,能帮助你在合适的场景中选择正确的工具。面对大哈希时,务必改用HSCAN或重新设计数据结构,避免性能隐患。
Redis HVALS哈希表字段值修改时间:2026-10-05 17:13:30