HKEYS、HVALS、HGETALL:获取所有字段、所有值或者所有字段和值
Redis 为散列提供了 HKEYS
、 HVALS
和 HGETALL
这三个命令,它们可以分别用于获取散列包含的所有字段、所有值以及所有字段和值:
- HKEYS hash
- HVALS hash
- HGETALL hash
图 3-19 储存文章数据的散列
举个例子,对于图 3-19 所示的 article::10086
散列来说,我们可以使用 HKEYS
命令去获取它包含的所有字段:
- redis> HKEYS article::10086
- 1) "title"
- 2) "content"
- 3) "author"
- 4) "created_at"
也可以使用 HVALS
命令去获取它包含的所有值:
- redis> HVALS article::10086
- 1) "greeting"
- 2) "hello world"
- 3) "peter"
- 4) "1442744762.631885"
还可以使用 HGETALL
命令去获取它包含的所有字段和值:
- redis> HGETALL article::10086
- 1) "title" -- 字段
- 2) "greeting" -- 字段的值
- 3) "content"
- 4) "hello world"
- 5) "author"
- 6) "peter"
- 7) "created_at"
- 8) "1442744762.631885"
在 HGETALL
命令返回的结果列表当中,每两个连续的元素就代表了散列中的一对字段和值,其中单数位置上的元素为字段,而复数位置上的元素则为字段的值。
另一方面,如果用户给定的散列并不存在,那么 HKEYS
、 HVALS
和 HGETALL
都将返回一个空列表:
- redis> HKEYS not-exists-hash
- (empty list or set)
- redis> HVALS not-exists-hash
- (empty list or set)
- redis> HGETALL not-exists-hash
- (empty list or set)
字段在散列中的排列顺序
Redis 散列包含的字段在底层是以无序方式储存的,根据字段插入的顺序不同,包含相同字段的散列在执行 HKEYS
命令、 HVALS
命令和 HGETALL
命令时可能会得到不同的结果,因此用户在使用这三个命令的时候,不应该对它们返回的元素的排列顺序做任何假设。如果有需要的话,用户可以对这些命令返回的元素进行排序,使得它们从无序变为有序。
举个例子,如果我们以不同的设置顺序创建两个完全相同的散列 hash1
和 hash2
:
- redis> HMSET hash1 field1 value1 field2 value2 field3 value3
- OK
- redis> HMSET hash2 field3 value3 field2 value2 field1 value1
- OK
那么 HKEYS
命令将以不同的顺序返回这两个散列的字段:
- redis> HKEYS hash1
- 1) "field1"
- 2) "field2"
- 3) "field3"
- redis> HKEYS hash2
- 1) "field3"
- 2) "field2"
- 3) "field1"
而 HVALS
命令则会以不同的顺序返回这两个散列的字段值:
- redis> HVALS hash1
- 1) "value1"
- 2) "value2"
- 3) "value3"
- redis> HVALS hash2
- 1) "value3"
- 2) "value2"
- 3) "value1"
至于 HGETALL
命令则会以不同的顺序返回这两个散列的字段和值:
- redis> HGETALL hash1
- 1) "field1"
- 2) "value1"
- 3) "field2"
- 4) "value2"
- 5) "field3"
- 6) "value3"
- redis> HGETALL hash2
- 1) "field3"
- 2) "value3"
- 3) "field2"
- 4) "value2"
- 5) "field1"
- 6) "value1"
其他信息
属性 | 值 |
---|---|
复杂度 | HKEYS 命令、 HVALS 命令和 HGETALL 命令的复杂度都为 O(N) ,其中 N 为散列包含的字段数量。 |
版本要求 | HKEYS 命令、 HVALS 命令和 HGETALL 命令都从 Redis 2.0.0 版本开始可用。 |