# Redis 操作命令 ☞ Hash

* [1. HDEL](#HDEL)
* [2. HEXISTS](#HEXISTS)
* [3. HGET](#HGET)
* [4. HGETALL](#HGETALL)
* [5. HKEYS](#HKEYS)
* [6. HLEN](#HLEN)
* [7. HMGET](#HMGET)
* [8. HMSET](#HMSET)
* [9. HSET](#HSET)
* [10. HSETNX](#HSETNX)
* [11. HSTRLEN](#HSTRLEN)
* [12. HVALS](#HVALS)

## HDEL

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(N) N是被删除的字段数量。

从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。

如果 key 指定的哈希集不存在，它将被认为是一个空的哈希集，该命令将返回0。

### 语法

`HDEL key field [field ...]`

### 返回值

integer-reply： 返回从哈希集中成功移除的域的数量，不包括指出但不存在的那些域

历史

* 在 2.4及以上版本中 ：可接受多个域作为参数。小于 2.4版本 的 Redis 每次调用只能移除一个域 要在早期版本中以原子方式从哈希集中移除多个域，可用 MULTI/EXEC块。

### 例子

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

## HEXISTS

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(1)

返回hash里面field是否存在

### 语法

`HEXISTS key field`

### 返回值

integer-reply, 含义如下：

* 1 hash里面包含该field。
* 0 hash里面不包含该field或者key不存在。

### 例子

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

## HGET

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(1)

返回 key 指定的哈希集中该字段所关联的值

### 语法

```
HGET key field
```

### 返回值

bulk-string-reply：该字段所关联的值。当字段不存在或者 key 不存在时返回nil。

### 例子

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

## HGETALL

**起始版本：2.0.0**

**时间复杂度：** 其中N是散列的大小

返回 key 指定的哈希集中所有的字段和值。返回值中，每个字段名的下一个是它的值，所以返回值的长度是哈希集大小的两倍

### 语法

`HGETALL key`

### 返回值

array-reply：哈希集中字段和值的列表。当 key 指定的哈希集不存在时返回空列表。

### 例子

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

## HINCRBY

增加 `key` 指定的哈希集中指定字段的数值。如果 `key` 不存在，会创建一个新的哈希集并与 `key` 关联。如果字段不存在，则字段的值在该操作执行前被设置为 0

`HINCRBY` 支持的值的范围限定在 64位 有符号整数

### 语法

`HINCRBY key field increment`

### 返回值

integer-reply：增值操作执行后的该字段的值。

### 例子

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

## HKEYS

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(N) where N is the size of the hash.

返回 key 指定的哈希集中所有字段的名字。

### 语法

`HKEYS key`

### 返回值

array-reply：哈希集中的字段列表，当 key 指定的哈希集不存在时返回空列表。

### 例子

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

## HLEN

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(1)

返回 `key` 指定的哈希集包含的字段的数量。

### 语法

`HLEN key`

### 返回值

integer-reply： 哈希集中字段的数量，当 `key` 指定的哈希集不存在时返回 0

### 例子

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

## HMGET

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(N) where N is the number of fields being requested.

返回 `key` 指定的哈希集中指定字段的值。

对于哈希集中不存在的每个字段，返回 `nil` 值。因为不存在的keys被认为是一个空的哈希集，对一个不存在的 `key` 执行 HMGET 将返回一个只含有 `nil` 值的列表

### 语法

`HMGET key field [field ...]`

### 返回值

array-reply ：含有给定字段及其值的列表，并保持与请求相同的顺序。

### 例子

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

## HMSET

**自2.0.0起可用。**

**时间复杂度：** O（N），其中N是要设置的字段数。

将指定的字段设置为存储在中的哈希中的相应值 `key`。该命令将覆盖哈希中已经存在的所有指定字段。如果`key`不存在，则创建一个包含哈希的新密钥。

根据Redis 4.0.0，HMSET被视为已弃用。请在新代码中使用HSET。

### 例子

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

## HSET

**自2.0.0起可用。**

\*\*时间复杂度：\*\*对于每个添加的字段/值对，为O（1），因此当使用多个字段/值对调用命令时，O（N）要添加N个字段/值对。

设置`field`在存储在哈希`key`来`value`。如果`key`不存在，则创建一个包含哈希的新密钥。如果`field`散列中已经存在，则将其覆盖。

从Redis 4.0.0开始，HSET是可变的，并允许多个`field`/`value`对。

### 语法

`HSET key field value [field value ...]`

### 返回值

整数回复：添加的字段数。

### 例子

```
redis> **HSET myhash field1 "Hello"**
(integer) 1

redis> **HGET myhash field1**
"Hello"
redis> 
```

## HSETNX

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(1)

只在 `key` 指定的哈希集中不存在指定的字段时，设置字段的值。如果 `key` 指定的哈希集不存在，会创建一个新的哈希集并与 `key` 关联。如果字段已存在，该操作无效果。

### 返回值

integer-reply：含义如下

* 1：如果字段是个新的字段，并成功赋值
* 0：如果哈希集中已存在该字段，没有操作被执行

### 例子

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

## HSTRLEN

**起始版本：3.2.0**

\*\*时间复杂度：\*\*O(1)

返回hash指定field的value的字符串长度，如果hash或者field不存在，返回0.

### 返回值

\[integer-reply:返回hash指定field的value的字符串长度，如果hash或者field不存在，返回0.

### 例子

```
redis> HMSET myhash f1 HelloWorld f2 99 f3 -256
OK
redis> HSTRLEN myhash f1
(integer) 10
redis> HSTRLEN myhash f2
(integer) 2
redis> HSTRLEN myhash f3
(integer) 4
redis> 
```

## HVALS

**起始版本：2.0.0**

\*\*时间复杂度：\*\*O(N) 其中N是散列的大小

返回 key 指定的哈希集中所有字段的值。

返回值

array-reply：哈希集中的值的列表，当 key 指定的哈希集不存在时返回空列表。

### 例子

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yanghaiji.gitbook.io/advanced-books/note/redis/book/commands/hashs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
