一、介绍
之前我们一再强调,redis是键值型的数据库,它的值的类型多种多样,在string类型中,值就是普通字符串。
但在Hash类型(也叫散列),其value是一个无序字典(其实就是一个hash表),类似于Java中的HashMap结构。
也就是说redis本身是一个key-value,而哈希类型的value又是一个哈希表,即key-value结构。
由于String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便,要么删除整个字符串,要么删掉重来
而Hash结构的key跟string没什么差异,但是value又分成了两部分:field
(也有人称为hashKey),value
,此时我们就不需要再使用JSON字符串来表示一个用户了,它可以将对象中的每个字段独立存储,此时针对单个字段做CRUD,并不会影响到其他字段。
![1652942027719](https://img-blog.csdnimg.cn/img_convert/28a97ad70522e01b5283f9334b9ceac3.png)
二、Hash类型的常见命令
这些命令可以对照着string类型进行学习,在它命令的基础上前面加上 H
就变成了Hash操作命令。
由于多了一个 field
,因此增改查的时候都需要告明是哪个 key
、哪个 field
。
![image-20240523085240462](https://img-blog.csdnimg.cn/img_convert/7c0b44afe9da5b29b35eda0cd0352e4e.png)
-
HSET key field value:添加或者修改hash类型key的field的值
-
HGET key field:获取一个hash类型key的field的值
-
HMSET:批量添加多个hash类型key的field的值
-
HMGET:批量获取多个hash类型key的field的值
-
HGETALL:获取一个hash类型的key中的所有的field和value
-
HKEYS:获取一个hash类型的key中的所有的field
-
HVALS:获取一个hash类型的key中的所有的value
-
HINCRBY:让一个hash类型key的字段值自增并指定步长
-
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
三、代码实现
HSET和HGET
存入到redis后,图形化界面如下,可以发现key里面存的value又是一个key-value结构,即hash结构
127.0.0.1:6379> HSET heima:user:3 name Lucy # 大key是 heima:user:3 小key是name,小value是Lucy
(integer) 1
127.0.0.1:6379> HSET heima:user:3 age 21 # 如果操作不存在的数据,则是新增
(integer) 1
# 修改某一个字段的值
127.0.0.1:6379> HSET heima:user:3 age 17 # 如果操作存在的数据,则是修改
(integer) 0
127.0.0.1:6379> HGET heima:user:3 name
"Lucy"
127.0.0.1:6379> HGET heima:user:3 age
"17"
HMSET和HMGET
127.0.0.1:6379> HMSET heima:user:4 name HanMeiMei
OK
127.0.0.1:6379> HMSET heima:user:4 name LiLei age 20 sex man # 存多组
OK
127.0.0.1:6379> HMGET heima:user:4 name age sex # 查多组
1) "LiLei"
2) "20"
3) "man"
HGETALL
127.0.0.1:6379> HGETALL heima:user:4
# 返回格式是:一个key一个value
1) "name"
2) "LiLei"
3) "age"
4) "20"
5) "sex"
6) "man"
HKEYS和HVALS
127.0.0.1:6379> HKEYS heima:user:4
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS heima:user:4
1) "LiLei"
2) "20"
3) "man"
HINCRBY
127.0.0.1:6379> HINCRBY heima:user:4 age 2
(integer) 22
127.0.0.1:6379> HINCRBY heima:user:4 age 2
(integer) 24
127.0.0.1:6379> HVALS heima:user:4
1) "LiLei"
2) "24"
3) "man"
127.0.0.1:6379> HINCRBY heima:user:4 age -2 # 负数就是负增长
(integer) 22
HSETNX
跟string类型的setnx一样,值不存在才执行,如果值已经存在,就不执行了。
127.0.0.1:6379> HSETNX heima:user4 sex woman
(integer) 1
127.0.0.1:6379> HGETALL heima:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
127.0.0.1:6379> HSETNX heima:user:3 sex woman
(integer) 1
127.0.0.1:6379> HGETALL heima:user:3
1) "name"
2) "Lucy"
3) "age"
4) "17"
5) "sex"
6) "woman"