Redis五大基本数据类型之Hash哈希(转载)

发布时间 2023-09-08 16:54:40作者: PowerCoder

一、概述

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。


String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

 

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

 

Hash类型的常见命令

  • 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不存在,否则不执行

以下是 String 类型和 Hash 类型的结构比较:

 

二、hset、hget

hset、hget主要用来设置和获取单条数据,格式说明如下:

#贴心测试如下:
 #设置值  hset key field value
192.168.65.15:6379> hset u1 name zs 
(integer) 1   

#获取值 hget key field
192.168.65.15:6379> hget u1 name  
"zs"

#获取值:如果key不存返回nil
192.168.65.15:6379> hget u2 name  
(nil)

#获取值:如果field不存返回nil
192.168.65.15:6379> hget u1 name1  
(nil)

 

三、hmset、hmget

上述一条一条地增加数据有点繁琐,为此,Redis准备了多条数据的操作,格式如下:

#贴心测试如下:
#批量设置值
192.168.65.15:6379> hmset u1 name zs age 22 sex boy  
OK

#批量获取值,按field顺序显示
192.168.65.15:6379> hmget u1 name age sex   
1) "zs"
2) "22"
3) "boy"

#如果key不存在,则返回nil
192.168.65.15:6379> hmget u2 name  
1) (nil)

#如果field不存在,则返回nil
192.168.65.15:6379> hmget u1 name name1  
1) "zs"
2) (nil)

 

四、hincrby、hsetnx

如果value是数值类型,我们可以用hincrby来增加大小;在添加时如果key-field不存在,才实现添加,可以用hsetnx命令。具体格式如下:

#贴心测试如下:
#查看age原来的值
192.168.65.15:6379> hget u1 age  
"22"

#hincrby给age增加5
192.168.65.15:6379> hincrby u1 age 5  
(integer) 27

#查看增加后的结果22+5=27
192.168.65.15:6379> hget u1 age  
"27"

#hsetnx设置如果field存在,则不添加 
192.168.65.15:6379> hsetnx  u1 age 22  
(integer) 0

#查看age还是27,没有变化
192.168.65.15:6379> hget u1 age  
"27"

#hsetnx设置如果field不存在,添加 
192.168.65.15:6379> hsetnx u1 age1 22 
(integer) 1

#查看age1是22
192.168.65.15:6379> hget u1 age1   
"22"

 

五、hexists、hgetall、hkeys、hvals、hlen

在查询时,有时我们需要知道key是否存在?存在的话有多少个field?如何显示所有的内容?如何显示所有的field或者value?为解决这些问题,我们帮你收集以下命令来解决:

#贴心测试如下:
#检查field是否存在
192.168.65.15:6379> hexists u1 age  
(integer) 1

#如果key不存在,返回0
192.168.65.15:6379> hexists u2 age  
(integer) 0

#如果field不存在,返回0
192.168.65.15:6379> hexists u1 age2  
(integer) 0

#获取u1结构中的全部field和value
192.168.65.15:6379> hgetall u1 
1) "name"
2) "zs"
3) "age"
4) "27"
5) "sex"
6) "boy"
7) "age1"
8) "22"

#获取u1结构中的全部field
192.168.65.15:6379> hkeys u1 
1) "name"
2) "age"
3) "sex"
4) "age1"

#获取u1结构中的全部value
192.168.65.15:6379> hvals u1 
1) "zs"
2) "27"
3) "boy"
4) "22"

#获取u1结构中field的数量
192.168.65.15:6379> hlen u1 
(integer) 4

 

六、hdel

我们一般用的删除单词是remove 和delete,这里删除用的是hdel,h表示hashes,del表示delete,具体如下:

#贴心测试如下:
#查看u1的数据
192.168.65.15:6379> hgetall u1  
1) "name"
2) "zs"
3) "age"
4) "27"
5) "sex"
6) "boy"
7) "age1"
8) "22"

#删除u1中 age1和 sex的数据
192.168.65.15:6379> hdel u1 age1 sex  
(integer) 2

#查看删除结果
192.168.65.15:6379> hgetall u1  
1) "name"
2) "zs"
3) "age"
4) "27"

关于Redis常用类型之Hash哈希存储类型就分享到这里了。

 

 

参考文献:

Redis干货 | 五种常用类型之Hash哈希存储类型详解

Redis五大基本数据类型之哈希(Hash)