# Hash命令

# HDEL

# 语法

HDEL key field [field ...]

# 描述

从存储在 key 的哈希中移除一个或多个字段。哈希中不存在的字段将被忽略。如果删除后没有字段剩余,则哈希键本身也会被移除。如果键不存在,该命令返回 0

# 参数

  • key

    保存哈希的键名。

  • field [field ...]

    要从哈希中删除的一个或多个字段。

# 示例

> HSET myhash field1 "foo"
(integer) 1
> HDEL myhash field1
(integer) 1
> HDEL myhash field2
(integer) 0

# HEXISTS

# 语法

HEXISTS key field

# 描述

返回指定 field 是否存在于存储在 key 的哈希中。如果键不存在或字段不存在,则返回 0;否则返回 1

# 参数

  • key

    保存哈希的键名。

  • field

    要检查是否存在的字段。

# 示例

> HSET myhash field1 "foo"
(integer) 1
> HEXISTS myhash field1
(integer) 1
> HEXISTS myhash field2
(integer) 0
> HEXISTS nonexistent field1
(integer) 0

# HGET

# 语法

HGET key field

# 描述

返回存储在 key 的哈希中 field 字段关联的值。如果字段或键不存在,则返回 nil

# 参数

  • key

保存哈希的键名。

  • field

要获取值的字段。

# 示例

> HSET myhash field1 "foo"
(integer) 1
> HGET myhash field1
"foo"
> HGET myhash field2
(nil)

# HGETALL

# 语法

HGETALL key

# 描述

返回存储在 key 的哈希中所有字段和值。在返回值中,每个字段名后紧跟其值,因此回复长度是哈希大小的两倍。如果键不存在,则返回空数组。

# 参数

  • key

保存哈希的键名。

# 示例

> HSET myhash field1 "Hello"
(integer) 1
> HSET myhash field2 "World"
(integer) 1
> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"

# HINCRBY

# 语法

HINCRBY key field increment

# 描述

将存储在 key 的哈希中 field 字段的整数值增加 increment。如果 key 不存在,则创建一个保存哈希的新键。如果 field 不存在,则在执行操作前将其设置为 0。支持的整数范围限于 64 位有符号整数。

# 参数

  • key

保存哈希的键名。

  • field

要增加值的字段。

  • increment

要加到字段值上的整数增量。

# 示例

> HSET myhash field 5
(integer) 1
> HINCRBY myhash field 1
(integer) 6
> HINCRBY myhash field -1
(integer) 5
> HINCRBY myhash field -10
(integer) -5

# HINCRBYFLOAT

# 语法

HINCRBYFLOAT key field increment

# 描述

将存储在 key 的哈希中指定 field 的浮点数值增加 increment。如果字段不存在,则在操作前将其设置为 0。负的 increment 会递减该字段。

在以下情况下会返回错误:

  • 键存储的值不是哈希。
  • 当前字段值或增量不是有效的双精度浮点数。

该命令会以 HSET 操作的形式传播到副本和 AOF。

# 参数

  • key

    存储哈希的键名。

  • field

    要递增的字段。

  • increment

    要加到字段值上的浮点数。使用负值表示递减。

# 示例

> HSET mykey field 10.50
(integer) 1
> HINCRBYFLOAT mykey field 0.1
"10.6"
> HINCRBYFLOAT mykey field -5
"5.6"
> HSET mykey field 5.0e3
(integer) 1
> HINCRBYFLOAT mykey field 2.0e2
"5200"

# HKEYS

# 语法

HKEYS key

# 描述

返回存储在 key 的哈希中所有的字段名。如果键不存在,则返回空数组。

# 参数

  • key

    存储哈希的键名。

# 示例

> HSET myhash field1 "Hello"
(integer) 1
> HSET myhash field2 "World"
(integer) 1
> HKEYS myhash
1) "field1"
2) "field2"

> HKEYS nohash
(empty array)

# HLEN

# 语法

HLEN key

# 描述

返回存储在 key 的哈希中包含的字段数量。如果键不存在,则返回 0

# 参数

  • key

    存储哈希的键名。

# 示例

> HSET myhash field1 "Hello"
(integer) 1
> HSET myhash field2 "World"
(integer) 1
> HLEN myhash
(integer) 2

> HLEN nohash
(integer) 0

# HMGET

# 语法

HMGET key field [field ...]

# 描述

返回存储在 key 的哈希中与指定 fields 相关联的值。对于哈希中不存在的每个字段,返回 nil。如果键不存在,HMGET 返回一个 nil 值列表。

# 参数

  • key

    存储哈希的键名。

  • field [field ...]

    一个或多个要获取值的字段。

# 示例

> HSET myhash field1 "Hello"
(integer) 1
> HSET myhash field2 "World"
(integer) 1
> HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)

> HMGET nohash field1
1) (nil)

# HMSET

# 语法

HMSET key field value [field value ...]

# 描述

在存储于 key 的哈希中,将指定字段设置为各自的值。已有字段会被覆盖。如果 key 不存在,则创建一个新的哈希。

# 参数

  • key

    存储哈希的键名。

  • field value [field value ...]

    要在哈希中设置的一个或多个字段-值对。

# 示例

> HMSET myhash field1 "Hello" field2 "World"
OK
> HGET myhash field1
"Hello"
> HGET myhash field2
"World"

# HRANDFIELD

# 语法

HRANDFIELD key [count [WITHVALUES]]

# 描述

从存储在 key 的哈希中返回一个或多个随机字段。

  • 仅使用 key 调用时,返回一个随机字段。
  • 如果 count 为正数,命令最多返回 count 个不同的字段(无重复)。返回字段数量不超过哈希大小。
  • 如果 count 为负数,命令精确返回 |count| 个字段,可能多次返回同一个字段。
  • WITHVALUES 修饰符在回复中包含每个选定字段的值。只能与 count 一起使用。

# 参数

  • key

    哈希键的名称。

可选参数 描述
count 要返回的字段数量。正值返回不同字段;负值允许重复字段。
WITHVALUES 同时返回每个选定字段的值。仅在指定 count 时有效。

# 示例

> HSET coin heads obverse tails reverse edge null
(integer) 3
> HRANDFIELD coin
"tails"
> HRANDFIELD coin
"edge"
> HRANDFIELD coin -5 WITHVALUES
1) "heads"
2) "obverse"
3) "edge"
4) (nil)
5) "tails"
6) "reverse"
7) "heads"
8) "obverse"
9) "edge"
10) (nil)

# HSCAN

# 语法

HSCAN key cursor [MATCH pattern] [COUNT count] [NOVALUES]

# 描述

迭代存储在 key 的哈希中的字段和值。该命令使用基于游标的迭代器,类似于 SCAN:从游标 0 开始,使用每次调用返回的游标作为下一次调用的参数,直到再次返回 0

# 参数

  • key

    哈希键的名称。

  • cursor

    游标值。使用 0 开始迭代。

可选参数 描述
MATCH pattern 仅返回名称匹配给定 glob 样式模式的字段。
COUNT count 每次迭代返回的字段数量的提示。默认值为 10。
NOVALUES 仅返回字段名称,不带值。

# 示例

> HSET myhash name "Redis" type "database" version "7"
(integer) 3
> HSCAN myhash 0
1) "0"
2) 1) "name"
   2) "Redis"
   3) "type"
   4) "database"
   5) "version"
   6) "7"
> HSCAN myhash 0 MATCH "ver*"
1) "0"
2) 1) "version"
   2) "7"
> HSCAN myhash 0 NOVALUES
1) "0"
2) 1) "name"
   2) "type"
   3) "version"

# HSET

# 语法

HSET key field value [field value ...]

# 描述

在存储于 key 的哈希中,将指定字段设置为各自的值。现有字段会被覆盖。如果 key 不存在,则创建一个新哈希。该命令返回新添加的字段数量。

# 参数

  • key

    哈希键的名称。

  • field

    要在哈希中设置的字段。

  • value

    对应字段的值。

  • field value ...(可选)

    要在同一命令中设置的额外字段-值对。

# 示例

> HSET myhash field1 "Hello"
(integer) 1
> HGET myhash field1
"Hello"
> HSET myhash field2 "Hi" field3 "World"
(integer) 2
> HGET myhash field2
"Hi"
> HGET myhash field3
"World"
> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "Hi"
5) "field3"
6) "World"

# HSETNX

# 语法

HSETNX key field value

# 描述

仅当 field 不存在时,才将存储在 key 的哈希中的 field 设置为 value。如果 key 不存在,则创建一个新哈希。如果 field 已存在,则该命令不生效。如果字段被设置则返回 1,如果字段已存在则返回 0

# 参数

  • key

    哈希键的名称。

  • field

    要设置的字段,仅当它不存在时。

  • value

    要设置的值。

# 示例

> HSETNX myhash field "Hello"
(integer) 1
> HSETNX myhash field "World"
(integer) 0
> HGET myhash field
"Hello"

# HSTRLEN

# 语法

HSTRLEN key field

# 描述

返回存储在 key 的哈希表中与 field 关联的值的字符串长度。如果 keyfield 不存在,则返回 0

# 参数

  • key

保存哈希表的键名。

  • field

要返回其值长度的字段。

# 示例

> HSET myhash f1 HelloWorld f2 99 f3 -256
(integer) 3
> HSTRLEN myhash f1
(integer) 10
> HSTRLEN myhash f2
(integer) 2
> HSTRLEN myhash f3
(integer) 4
> HSTRLEN myhash nonexistent_field
(integer) 0

# HVALS

# 语法

HVALS key

# 描述

返回存储在 key 的哈希表中的所有值。仅返回值,不包含字段名。如果 key 不存在,则返回空列表。

# 参数

  • key

保存哈希表的键名。

# 示例

> HSET myhash field1 "Hello"
(integer) 1
> HSET myhash field2 "World"
(integer) 1
> HVALS myhash
1) "Hello"
2) "World"