Hash类型相关命令 
Hash(哈希散列)是 Redis 基本数据类型,值value 中存储的是 hash 表。Hash 特别适合用于存储对象。
 特点是使用key/value键值对保存数据,类似Java中的Map结构,区别在于Hash类型的value还是一个键值对,具体就是Java中Map<String, Map<Object, Object>>对象。
1. HSET命令 
语法: HSET key field value [field value ...]
 用于为存储在key中的哈希表的field字段赋值value。如果哈希表不存在,一个新的哈希表被创建并进行HSET操作。如果字段(field)已经存在于哈希表中,旧值将被覆盖。
## 保存一个id为001的user对象
127.0.0.1:6379> hset user:001 id 001 name jack age 25
(integer) 3
127.0.0.1:6379> hget user:001 name
"jack"2. HMSET命令(已过时) 
语法: HMSET key field value [field value ...]
 用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行HMSET操作。自Redis 4.0.0之后被置为过时,用HSET命令作用等效。
127.0.0.1:6379> hmset user:002 id 002 name xiaomi age 21
OK3. HGET命令 
语法: HGET key field
 用于返回哈希表中指定字段field的值。
127.0.0.1:6379> hget user:002 age
"21"4. HMGET命令 
语法: HMGET key field [field ...]
127.0.0.1:6379> hmget user:001 id name age addr
1) "001"
2) "jack"
3) "25"
4) (nil)5. HGETALL命令 
语法: HGETALL key
 用于返回存储在key中的哈希表中所有的域和值。
127.0.0.1:6379> hgetall user:002
1) "id"
2) "002"
3) "name"
4) "xiaomi"
5) "age"
6) "21"6. HDEL命令 
语法: HDEL key field [field ...]
 用于删除哈希表key中的一个或多个指定字段,不存在的字段将被忽略。如果key不存在,会被当作空哈希表处理并返回0。
127.0.0.1:6379> hdel user:002 age
(integer) 1
127.0.0.1:6379> hmget user:002 age
1) (nil)7. HLEN命令 
语法: HLEN key
 用于获取哈希表中字段(fields)的数量。
127.0.0.1:6379> hlen user:002
(integer) 2
127.0.0.1:6379> hlen user:001
(integer) 38. HEXISTS命令 
语法: HEXISTS key field
 用于查看哈希表的指定字段field是否存在。返回值有两种:
- 1 哈希表含有给定字段field。
- 0 哈希表不含有给定字段,或key不存在。
127.0.0.1:6379> hexists user:002 age
(integer) 0
127.0.0.1:6379> hexists user:002 name
(integer) 1
127.0.0.1:6379> hexists user:003 name
(integer) 09. HKEYS命令 
语法: HKEYS key
 返回存储在key中哈希表的所有域。
127.0.0.1:6379> hkeys user:002
1) "id"
2) "name"
127.0.0.1:6379> hkeys user:001
1) "id"
2) "name"
3) "age"10. HVALS命令 
语法: HVALS key
 返回哈希表所有域(field)的值。
127.0.0.1:6379> hvals user:003
(empty array)
127.0.0.1:6379> hvals user:002
1) "002"
2) "xiaomi"11. HINCRBY命令 
语法: HINCRBY key field increment
 为哈希表 key 中的域field的值加上增量increment。增量也可以为负数,相当于对给定域进行减法操作。如果key不存在,一个新的哈希表被创建并执行HINCRBY命令。如果域field不存在,那么在执行命令前,域的值被初始化为0。对一个储存字符串值的域field执行HINCRBY命令将造成一个错误ERR hash value is not an integer。
127.0.0.1:6379> hset company:yinhai salary 10500
(integer) 1
127.0.0.1:6379> hincrby company:yinhai salary 300
(integer) 300
127.0.0.1:6379> hincrby company:yinhai salary 300
(integer) 600
127.0.0.1:6379> hget company:yinhai salary
"11100"
127.0.0.1:6379> hincrby company:yinhai name 300
(error) ERR hash value is not an integer12. HINCRBYFLOAT命令 
语法: HINCRBYFLOAT key field increment
 为哈希表key中的域 field 加上浮点数增量increment。如果哈希表中没有域 field ,那么INCRBYFLOAT会先将域field的值设为 0 ,然后再执行加法操作。如果key不存在,那么INCRBYFLOAT会先创建一个哈希表,再创建域field,最后再执行加法操作。
 当以下任意一个条件发生时,返回一个错误:
- field的值不是字符串类型(因为Redis中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)
- field当前的值或给定的增量- increment不能解释(parse)为双精度浮点数(double precision floating point number)
127.0.0.1:6379> hincrbyfloat company:yinhai salary -150.5
"10949.5"
127.0.0.1:6379> hincrbyfloat company:yinhai age -10.5
"-10.5"
127.0.0.1:6379> hget company:yinhai age
"-10.5"13. HSETNX命令 
语法: HSETNX key field value
 用于为哈希表中不存在的字段赋值。如果字段已经存在于哈希表中,操作无效。如果key不存在,一个新哈希表被创建并执行HSETNX命令。
127.0.0.1:6379> hsetnx user:001 age 123
(integer) 0
127.0.0.1:6379> hget user:001 age
"25"
127.0.0.1:6379> hsetnx user:001 addr sichuan
(integer) 1
127.0.0.1:6379> hget user:001 addr
"sichuan"14. HSTRLEN命令 
语法: HSTRLEN key field
 返回存储在key中的哈希表里,与给定域field相关联的值的字符串长度(string length)。
127.0.0.1:6379> hstrlen user:001 name
(integer) 4