Hash 数据类型与结构


一、Hash 类型介绍

Redis hash数据结构 是一个键值对(key-value)集合,它是一个 string 类型的 field 和 value 的映射表,redis 本身就是一个 key-value 型数据库,因此 hash 数据结构相当于在 value 中又套了一层 key-value 型数据。所以 redis 中 hash 数据结构特别适合存储关系型对象。比如用来存储学生基本信息,或者用户信息等。


常用命令


hmset 命令

描述:用于同时将多个 field-value (字段-值)对设置到哈希表中。假如hash表中已经存在 field,则会对其进行覆盖。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

命令使用:[hmset 命令] [key 表名] [field 名称] [value值] [field 名称] [value值] ...

127.0.0.1:6379> hmset users id 1 username starsky age 18 sex 1
OK
127.0.0.1:6379>

hmget 命令

描述:用于返回 hash 表中 field 字段对应的值,如果 field 不存在,那么返回 nil 值。

命令使用:[hmget 命令] [key 表名] [field 名称] [field 名称] ...

127.0.0.1:6379> hmget users id username age sex
1) "1"
2) "starsky"
3) "18"
4) "1"
127.0.0.1:6379>

hset 命令

描述:对 hash 表中 field 对应的value进行赋值,如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

命令使用:[hset 命令] [key 表名] [field 名称] [value 值]

127.0.0.1:6379> hset users address gd
(integer) 1
127.0.0.1:6379> hset users sex 0
(integer) 0
127.0.0.1:6379> hmget users id username age sex address
1) "1"
2) "starsky"
3) "18"
4) "0"
5) "gd"
127.0.0.1:6379>

hvals 命令

描述:用于返回哈希表所有 field 对应的值。

命令使用:[hvals 命令] [key 表名]

127.0.0.1:6379> hvals users
1) "1"
2) "starsky"
3) "18"
4) "0"
5) "gd"
127.0.0.1:6379> 

hdel 命令

描述:用于删除指定哈希表中的一个或多个field,不存在的field将被忽略。

命令使用:[hdel 命令] [key 表名] [field 名称] ...

127.0.0.1:6379> hdel users sex address
(integer) 2
127.0.0.1:6379> hvals users
1) "1"
2) "starsky"
3) "18"
127.0.0.1:6379> 

hgetall 命令

描述:用于返回哈希表中,所有的字段和值。

命令使用:[hgetall 命令] [key 表名]

127.0.0.1:6379> hgetall users
1) "id"
2) "1"
3) "username"
4) "starsky"
5) "age"
6) "18"
127.0.0.1:6379> 



Hash 类型应用场景


一、购物车

购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品id以及用于需要购买的数据到后端,php 通过前端传递的参数进而完成购物车的添加,增加或者减少购物车购买数量,删除或者清空购物车等功能。

如果说是使用redis来做我们可以以用户 id 为 key,商品 id 为 field,商品数量为 value,恰好构成了购物车的3个要素。

如:

				[命令] [购物车用户:ID] [产品:ID] [数量]
127.0.0.1:6379> hmset shopcartuser:1 product:1 2
OK
127.0.0.1:6379> hmget shopcartuser:1 product:1
1) "2"
127.0.0.1:6379> 



二、存储对象

hash 类型的 (key, field, value) 的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。

在介绍string类型的应用场景时有所介绍,string + json 也是存储对象的一种方式,那么存储对象时,到底用 string + json 还是用 hash 呢?

两种存储方式的对比如下表所示:

String + jsonHash
效率很高
容量
灵活性
序列化简单复杂

当对象的某个属性需要频繁修改时,不适合用 string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用 hash 类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。

当然,不常变化的属性存储在 hash 类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当对象的某个属性不是基本类型或字符串时,使用 hash 类型就必须手动进行复杂序列化,比如,商品的标签是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表等,即使以 coupons(优惠券)作为 field,value 想存储优惠券对象列表也还是要使用 json 来序列化,这样的话序列化工作就太繁琐了,不如直接用 string + json 的方式存储商品信息来的简单。




Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐