# 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)
```
