# 2.3 针对哈希类型变量的命令

## 2.3.1 设置并获取哈希值

* `HSET`:设置哈希值.语法:`HSET key field value [field value ...]`.其中:
  * `key`:待缓存对象的键名
  * `field value`:以键值对形式描述的对象数据.针对同一个key,可以用多个`field value`对来存储数据.这里的`field`可以理解成对象的属性名,`value`可以理解为对象的属性值
  * 注:若一个key已经被定义为类型A,再使用其他类型的指令操作该key时将会报错
  * 返回值:
    * `1`:表示成功设置了置顶field的值.若field之前不存在,则创建新的field并设置值
    * `0`:表示字段已存在,`HSET`命令将更新字段的值
    * `-1`:表示命令执行出错或参数错误
* `HGET`:读取哈希值.语法:`HGET key field`.其中:
  * `key`:待读取对象的键名
  * 如果存在key和field所对应的数据,则返回该数据,否则返回nil

例:

* 存储一个工号为001的员工信息.其中:
  * 姓名:peter
  * 薪水:10000
  * 部门:dataTeam

```
127.0.0.1:6379> HSET 001 name 'peter' salary 10000 dep dataTeam
(integer) 3
```

可以看到,`HSET`命令的返回值为设置的字段数量

* 查询该员工的姓名、薪水、部门:

```
127.0.0.1:6379> HGET 001 name
"peter"
```

```
127.0.0.1:6379> HGET 001 salary
"10000"
```

```
127.0.0.1:6379> HGET 001 dep
"dataTeam"
```

* 查询一个不存在的key:

```
127.0.0.1:6379> HGET 002 name
(nil)
```

可以看到,返回值为nil

* 查询一个存在的key中不存在的field:

```
127.0.0.1:6379> HGET 001 age
(nil)
```

可以看到,返回值也为nil

* 查询哈希值时只传入key而不传入field:

```
127.0.0.1:6379> HGET 001
(error) ERR wrong number of arguments for 'hget' command
```

## 2.3.2 hsetnx命令

* `HSETNX`
  * 语法:`HSETNX key field value`
  * 功能:只有当key和field所对应的value不存在时才设置value.设置成功返回1,设置失败返回0
* 例:重新设置工号为001的员工姓名

查看当前姓名:

```
127.0.0.1:6379> HGET 001 name
"peter"
```

使用`HSET`命令设置姓名:

```
127.0.0.1:6379> HSET 001 name 'johnson'
(integer) 0
127.0.0.1:6379> HGET 001 name
"johnson"
```

可以看到,使用`HSET`命令可以更新field值

* 例:若工号为002的员工姓名不存在,则设置员工姓名

```
127.0.0.1:6379> HSETNX 002 name 'tom'
(integer) 1
```

可以看到,此时由于key为`002`、field为`name`的值不存在,故设置成功,返回1

```
127.0.0.1:6379> HSETNX 002 name 'tom'
(integer) 0
```

可以看到,此时由于key为`002`、field为`name`的值已存在,故设置失败,返回0

注:**`HSETNX`命令的key后边只能跟一对`field value`**

```
127.0.0.1:6379> HSETNX 002 salary 9000 dep dataTeam
(error) ERR wrong number of arguments for 'hsetnx' command
```

## 2.3.3 针对key的相关操作

* `HKEYS key`
  * 功能:查看key对应的哈希类型数据的所有field
* `HVALS key`:
  * 功能:查看key对应的哈希类型的所有value
* `HGETALL key`:
  * 功能:以field和value对的形式查看key对应的哈希类型数据

例:

* 设置一个哈希类型的数据:

```
127.0.0.1:6379> HSET 010 name 'mary' salary 8000
(integer) 2
```

* 查看key对应的所有field:

```
127.0.0.1:6379> HKEYS 010
1) "name"
2) "salary"
```

* 查看key所对应的所有value:

```
127.0.0.1:6379> HVALS 010
1) "mary"
2) "8000"
```

* 查看key所对应的field-value对:

```
127.0.0.1:6379> HGETALL 010
1) "name"
2) "mary"
3) "salary"
4) "8000"
```

* 对一个不存在的key执行`HKEYS`、`HVALS`、`HGETALL`指令:

```
127.0.0.1:6379> HKEYS 00
(empty array)
127.0.0.1:6379> HVALS 00
(empty array)
127.0.0.1:6379> HGETALL 00
(empty array)
```

可以看到,当无法找到key时,会返回`empty array`

## 2.3.4 用hexists命令判断值是否存在

* `HEXISTS`:
  * 语法:`HEXISTS key field`
  * 功能:判断key和field对应的value是否存在.存在返回1,反之则返回0

例:

```
127.0.0.1:6379> HEXISTS 010 name
(integer) 1
```

```
127.0.0.1:6379> HEXISTS 00 name
(integer) 0
```

```
127.0.0.1:6379> HEXISTS 00
(error) ERR wrong number of arguments for 'hexists' command
```

若调用`HEXISTS`命令时只写了1个参数则会报错

## 2.3.5 对哈希类型数据的删除操作

* `HDEL`:
  * 语法:`HDEL key field [field ...]`
  * 功能:删除key指定的field数据.该命令可以同时删除1个key对应的多个field数据.若想删除key对应的整个哈希类型数据,则需使用`DEL key`命令(该命令可以对所有类型的数据使用,删除成功返回1;删除失败返回0)

例:

删除key为001所对应的哈希类型的name和salary这2个field:

```
127.0.0.1:6379> HDEL 001 name salary
(integer) 2
```

删除key对应的哈希类型中一个不存在的field:

```
127.0.0.1:6379> HDEL 001 gender
(integer) 0
```

调用`HDEL`指令时只填写了1个参数:

```
127.0.0.1:6379> HDEL 001
(error) ERR wrong number of arguments for 'hdel' command
```

可以看到,会报错

删除key对应的整个哈希类型数据:

```
127.0.0.1:6379> DEL 001
(integer) 1
```

查看删除的结果:

```
127.0.0.1:6379> HVALS 001
(empty array)
```


---

# 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://redis.sai.show/di-2-zhang-shi-jian-redis-de-ji-ben-shu-ju-lei-xing/2.3-zhen-dui-ha-xi-lei-xing-bian-liang-de-ming-ling.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.
