HKEYS、HVALS、HGETALL:获取所有字段、所有值或者所有字段和值

Redis 为散列提供了 HKEYSHVALSHGETALL 这三个命令,它们可以分别用于获取散列包含的所有字段、所有值以及所有字段和值:

  1. HKEYS hash
  2.  
  3. HVALS hash
  4.  
  5. HGETALL hash

图 3-19 储存文章数据的散列_images/IMAGE_HKEYS_HVALS_HGETALL.png


举个例子,对于图 3-19 所示的 article::10086 散列来说,我们可以使用 HKEYS 命令去获取它包含的所有字段:

  1. redis> HKEYS article::10086
  2. 1) "title"
  3. 2) "content"
  4. 3) "author"
  5. 4) "created_at"

也可以使用 HVALS 命令去获取它包含的所有值:

  1. redis> HVALS article::10086
  2. 1) "greeting"
  3. 2) "hello world"
  4. 3) "peter"
  5. 4) "1442744762.631885"

还可以使用 HGETALL 命令去获取它包含的所有字段和值:

  1. redis> HGETALL article::10086
  2. 1) "title" -- 字段
  3. 2) "greeting" -- 字段的值
  4. 3) "content"
  5. 4) "hello world"
  6. 5) "author"
  7. 6) "peter"
  8. 7) "created_at"
  9. 8) "1442744762.631885"

HGETALL 命令返回的结果列表当中,每两个连续的元素就代表了散列中的一对字段和值,其中单数位置上的元素为字段,而复数位置上的元素则为字段的值。

另一方面,如果用户给定的散列并不存在,那么 HKEYSHVALSHGETALL 都将返回一个空列表:

  1. redis> HKEYS not-exists-hash
  2. (empty list or set)
  3.  
  4. redis> HVALS not-exists-hash
  5. (empty list or set)
  6.  
  7. redis> HGETALL not-exists-hash
  8. (empty list or set)

字段在散列中的排列顺序

Redis 散列包含的字段在底层是以无序方式储存的,根据字段插入的顺序不同,包含相同字段的散列在执行 HKEYS 命令、 HVALS 命令和 HGETALL 命令时可能会得到不同的结果,因此用户在使用这三个命令的时候,不应该对它们返回的元素的排列顺序做任何假设。如果有需要的话,用户可以对这些命令返回的元素进行排序,使得它们从无序变为有序。

举个例子,如果我们以不同的设置顺序创建两个完全相同的散列 hash1hash2

  1. redis> HMSET hash1 field1 value1 field2 value2 field3 value3
  2. OK
  3.  
  4. redis> HMSET hash2 field3 value3 field2 value2 field1 value1
  5. OK

那么 HKEYS 命令将以不同的顺序返回这两个散列的字段:

  1. redis> HKEYS hash1
  2. 1) "field1"
  3. 2) "field2"
  4. 3) "field3"
  5.  
  6. redis> HKEYS hash2
  7. 1) "field3"
  8. 2) "field2"
  9. 3) "field1"

HVALS 命令则会以不同的顺序返回这两个散列的字段值:

  1. redis> HVALS hash1
  2. 1) "value1"
  3. 2) "value2"
  4. 3) "value3"
  5.  
  6. redis> HVALS hash2
  7. 1) "value3"
  8. 2) "value2"
  9. 3) "value1"

至于 HGETALL 命令则会以不同的顺序返回这两个散列的字段和值:

  1. redis> HGETALL hash1
  2. 1) "field1"
  3. 2) "value1"
  4. 3) "field2"
  5. 4) "value2"
  6. 5) "field3"
  7. 6) "value3"
  8.  
  9. redis> HGETALL hash2
  10. 1) "field3"
  11. 2) "value3"
  12. 3) "field2"
  13. 4) "value2"
  14. 5) "field1"
  15. 6) "value1"

其他信息

属性
复杂度HKEYS 命令、 HVALS 命令和 HGETALL 命令的复杂度都为 O(N) ,其中 N 为散列包含的字段数量。
版本要求HKEYS 命令、 HVALS 命令和 HGETALL 命令都从 Redis 2.0.0 版本开始可用。