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
OK
3. 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) 3
8. 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) 0
9. 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 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)
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