hash 类型是一个 string 类型的 field 和 value 的映射表, 每个 hash 可以存储 232 - 1 键值对(40 多亿),hash 类型主要有以下应用场景.
1. 购物车
以用户 id 为 key, 商品 id 为 field, 商品数量为 value, 恰好构成了购物车的 3 个要素, 如下图所示.
2. 存储对象
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 的方式存储商品信息来的简单.
综上, 一般对象用 string + JSON 存储, 对象中某些频繁变化的属性抽出来用 hash 存储.
hash 类型的常用命令可参考 http://www.runoob.com/redis/redis-hashes.html
加入 string 类型的应用场景后的思维导图如下.
来源: https://www.cnblogs.com/pangzizhe/p/10657801.html