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 存储对象,相对来说更新操作比较灵活