Skip to content

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)已经存在于哈希表中,旧值将被覆盖。

sh
## 保存一个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命令作用等效。

sh
127.0.0.1:6379> hmset user:002 id 002 name xiaomi age 21
OK

3. HGET命令

语法: HGET key field
用于返回哈希表中指定字段field的值。

sh
127.0.0.1:6379> hget user:002 age
"21"

4. HMGET命令

语法: HMGET key field [field ...]

sh
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中的哈希表中所有的域和值。

sh
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。

sh
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)的数量。

sh
127.0.0.1:6379> hlen user:002
(integer) 2
127.0.0.1:6379> hlen user:001
(integer) 3

8. HEXISTS命令

语法: HEXISTS key field
用于查看哈希表的指定字段field是否存在。返回值有两种:

  • 1 哈希表含有给定字段field
  • 0 哈希表不含有给定字段,或key不存在。
sh
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) 0

9. HKEYS命令

语法: HKEYS key
返回存储在key中哈希表的所有域。

sh
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)的值。

sh
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

sh
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 integer

12. 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)
sh
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命令。

sh
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)。

sh
127.0.0.1:6379> hstrlen user:001 name
(integer) 4