一、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>
一、购物车
购物车功能主要是通过用户点击商品添加到购物车,前端会传递商品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 + json | Hash | |
---|---|---|
效率 | 很高 | 高 |
容量 | 低 | 低 |
灵活性 | 低 | 高 |
序列化 | 简单 | 复杂 |
当对象的某个属性需要频繁修改时,不适合用 string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用 hash 类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。
当然,不常变化的属性存储在 hash 类型里也没有问题,比如商品名称、商品描述、上市日期等。但是,当对象的某个属性不是基本类型或字符串时,使用 hash 类型就必须手动进行复杂序列化,比如,商品的标签是一个标签对象的列表,商品可领取的优惠券是一个优惠券对象的列表等,即使以 coupons(优惠券)作为 field,value 想存储优惠券对象列表也还是要使用 json 来序列化,这样的话序列化工作就太繁琐了,不如直接用 string + json 的方式存储商品信息来的简单。