hash 数据类型简介
Q:Redis 当中的 hash 数据类型是什么?
简单来说,就是 value 里面再套一个或多个 key-value 对象。
在前面,我们说 string 类型时提到,一个 key 对应一个 value:
key <---> value
而针对 hash,它的对照关系为:
key <---> value
↓
key1-value1(或 field1-value1)
key2-value2(或 field2-value2)
...
为了与整体的 key 名称做区分,hash 数据类型中的 key 被称为 field(字段)。请注意!field 和 value 一 一 对应,不允许重复。
比如写入数据的这样一个例子:
192.168.100.3:6379> select 1
192.168.100.3:6379[1]> hset user:1 name Cao age 20 sex man
192.168.100.3:6379[1]> hset user:2 name Zhao age 19 sex woman
如您所见的那样,当您需要使用 Redis 与现实世界中的对象(人、物、事、订单等)属性进行关联时,使用 hash 数据类型是一个不错的选择。
hset
命令和 hsetnx
命令
该命令用来为 key 的 value 设置 hash 数据类型,基本用法为:
192.168.100.3:6379[1]> help hset
HSET key field value [field value ...]
summary: Creates or modifies the value of a field in a hash.
since: 2.0.0
group: hash
如果要更加安全的使用 hash 数据类型,您可以使用 hsetnx
命令作为替代,即当一个 field 不存在时,才将 field-value 写入到 DB 中(写入成功后,命令返回 1,写入不成功,命令执行后返回 0)
192.168.100.3:6379[1]> hsetnx user:1 student yes
(integer) 1
192.168.100.3:6379[1]> hsetnx user:1 student no
(integer) 0
如果一个 field 存在,hset
命令也能用于更新 field-value 中的 value,比如 hset user:1 student no
hget
命令 和 hmget
命令
# 如果要获取单个 key 中单个 field 的 value ,可使用 `hget` 命令,如下:
192.168.100.3:6379[1]> hget user:1 age
"20"
# 如果要获取单个 key 中多个 field 的 value ,可使用 `hmget` 命令,如下:
192.168.100.3:6379[1]> hmget user:1 age name sex
1) "20"
2) "Cao"
3) "man"
hgetall
命令
查看单个 key 当中的所有 field-value
192.168.100.3:6379[1]> hgetall user:1
1) "name"
2) "Cao"
3) "age"
4) "20"
5) "sex"
6) "man"
7) "student"
8) "no"
hkeys
命令
针对 hash 数据类型,查看单个 key 当中所有的 field
192.168.100.3:6379[1]> hkeys user:1
1) "name"
2) "age"
3) "sex"
4) "student"
hvals
命令
针对 hash 数据类型,查看单个 key 当中的所有 value。
192.168.100.3:6379[1]> HVALS user:1
1) "Cao"
2) "20"
3) "man"
4) "no"
hexists
命令
针对 hash 数据类型,用于判断单个 key 当中的一个 field 是否存在。
192.168.100.3:6379[1]> hexists user:1 class
(integer) 0
hdel
命令
用于删除单个 key 当中的一个或多个 field。
192.168.100.3:6379[1]> hdel user:1 name age sex
(integer) 3
192.168.100.3:6379[1]> hgetall user:1
1) "student"
2) "no"
将数据重新补上,方便后面演示
192.168.100.3:6379[1]> hset user:1 name Cao age 20 sex man
(integer) 3
192.168.100.3:6379[1]> hgetall user:1
1) "student"
2) "no"
3) "name"
4) "Cao"
5) "age"
6) "20"
7) "sex"
8) "man"
hlen
命令
用于获取单个 key 当中 field-value 对的数量。
192.168.100.3:6379[1]> hlen user:1
(integer) 4
hstrlen
命令
针对 hash 数据类型,返回特定 field 的 value 的长度。一个数字、一个字母、一个英语标点算 1 个长度。
192.168.100.3:6379[1]> hstrlen user:1 name
(integer) 3
hincrby
命令
针对 hash 数据类型,如果单个 field 的 value 是数值型,为 field 的 value 自增(正整数时)或自减(负整数时)。比如:
192.168.100.3:6379[1]> hincrby user:1 age 3
(integer) 23
192.168.100.3:6379[1]> HINCRBY user:1 age -2
(integer) 21
hincrebyfloat
命令
针对 hash 数据类型,如果单个 field 的 value 是数值型,为 field 的 value 自增(正整数或正小数时)或自减(负整数或负小数时)。比如:
192.168.100.3:6379[1]> HINCRBYFLOAT user:1 age -1.5
"19.5"