hash 类型
-
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
-
需要的存储结构:一个存储空间保存多个键值对数据
-
hash 类型:底层使用哈希表结构实现数据存储
hash 存储优化:
- 如果 field 数量较少,存储结构优化为类数组结构
- 如果 field 数量较多,存储结构使用 HashMap 结构
hash 类型数据的基本操作
-
添加/修改数据
hset key field value
-
获取数据
hget key field hgetall key
-
删除数据
hdel key field1 [field2]
-
添加/修改多个数据
hmset key field1 value1 field2 value2 ...
-
获取多个数据
hmget key field1 field2 ...
-
获取哈希表中字段的数量
hlen key
-
获取哈希表中是否存在指定的字段
hexists key field
hash 类型数据扩展操作
-
获取哈希表中所有的字段名或字段值
hkeys key hvals key
-
设置指定字段的数值数据增加指定范围的值
hincrby key field increment hincrbyfloat key field increment
hash 类型数据操作的注意事项
- hash 类型下的 value 只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
- 每个 hash 可以存储 2^32 - 1 个键值对
- hash 类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但 hash 设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将 hash 作为对象列表使用
- hgetall 操作可以获取全部属性,如果内部 field 过多,遍历整体数据效率就会很低,有可能成为数据访瓶颈
hash 类型应用场景
1、业务场景
电商网站购物车设计与实现
1.1、业务分析
-
仅分析购物车的 redis 存储模型
添加、浏览、更改数量、删除、清空
-
购物车与数据库间持久化同步(不讨论)
-
购物车与订单间关系(不讨论)
- 提交购物车:读取数据生成订单
- 商家临时价格调整:隶属于订单级别
-
未登录用户购物车信息存储(不讨论)
- cookie 存储
1.2、解决方案
- 以客户 id 作为 key,每位客户创建一个 hash 存储结构存储对应的购物车信息
- 将商品编号作为 field,购买数量作为 value 进行存储
- 添加商品:追加全新的 field 与 value
- 浏览:遍历 hash
- 更改数量:自增/自减,设置 value 值
- 删除商品:删除 field
- 清空:删除 key
当前仅仅是将数据存储到了 redis 中,并没有起到加速的作用,商品信息还必须二次去数据库查询
-
每条购物车中的商品记录保存两条 field
-
field1 专用于保存购买数量
- 命名格式:商品 id:nums
- 保存数据:数值
-
field2 专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等
- 命名格式:商品 id:info
- 保存数据:json
hsetnx key field value
如果 key 有值则操作失败返回 0
总结:redis 应用于购物车数据存储设计
2、业务场景
双 11 活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商品抢购上限 1000 张
2.1 解决方案
- 以商家 id 作为 key
- 将参与抢购的商品 id 作为 field
- 将参与抢购的商品数量作为对应的 value
- 抢购时使用降值得方式控制产品数量
- 实际业务中还有超卖等问题,这里不讨论
总结:redis 应用于抢购,限购类、限量发放优惠券、激活码等业务的数据存储设计
3、业务场景
string 存储对象 (json) 与 hash 存储对象
- string 存储对象,常用于对数据进行过整体操作,比如:一次性更新全部数据,或一次性获取全部数据,偏向于只读操作
- hash 存储对象,相对来说更新操作比较灵活