4.1 用hash实现购物车
在这里我们不讨论购物车与数据库间的持久化同步,也不讨论购物车与订单之间的关系,同时忽略未登录用户购物车信息存储。我们仅仅是用 redis 的存储模型来 对购物车 的条目进行 添加、浏览、更改数量、删除、清空
(1)以客户 id 作为 key,每位用户创建一个 hash 存储结构对应购物车信息
(2)将商品编号作为 field,购买数量作为 value 进行存储
(3)添加商品:追加全新的 field 于 value
(4)浏览商品:遍历 hash
(5)更改数量:自增/自减,设置 value 值
(6)删除商品:删除 field
(7)清空:删除 key
示例代码如下
# 001 用户购买 ID为101商品 100件,ID为102的商品 200件
hmset 001 101 100 102 200
# 002 用户购买 ID为102商品 1件,ID为104的商品 7件
hmset 002 102 1 104 7
当前仅仅是将数量存储到 redis 中,并没有起到加速作用,因为商品信息还需要查询数据库。可以使用以下方案解决:
每条购物车中的商品信息记录保存为两个 field
命名格式:商品 id:nums
保存数据:数值
- field2 专门用于保存购物车中显示的商品信息,包含文字描述,图片地址,所属商家信息等
命名格式:商品 id:info
保存数据:json
示例代码如下
# 001 用户 购买 ID为101的商品 2件,商品的信息为:{"name":"good name"}
hmset 001 101:num 2 101:info "{\"name\":\"goods name\"}"
# 002 用户 购买 ID为101的商品 1件,商品的信息为:{"name":"good name"}
hmset 002 101:num 1 101:info "{\"name\":\"goods name\"}"
在上面的101:info
对应的值中,字符串包含了空格,所以用双引号引用起来,达到转义的目的。
由于 field2 可能在多条商品记录中存在,固 field2 里的数据可保存到独立的 hash。此时,如果每添加一条购物车记录,就保存一次 hash 数据,显然是不合理的,可以通过hsetnx
操作来保存数据,如果数据存在,则不执行保存操作。
命令格式如下
hsetnx key field value
代码示例如下
# 将id为101 的商品独立存起来
hsetnx info 101 "{\"name\":\"goods name\"}"
4.2 用hash实现抢购
案例:双 11 活动日,销售手机充值卡的商家对移动、联通、电信的 30 元、50 元、100 元商品推出抢购活动,每种商品的抢购上限为 100。
(1)以商家 id 作为 key
(2)将参与抢购的商品作为 field
(3)将参与抢购的商品数量作为对应的 value
(4)抢购时使用降值的方式控制产品数量
(5)实际业务中还有超卖等实际问题,这里不做讨论
商品初始信息
# p01商家下,c30充值券1000张,c50充值券1000张,c100充值券1000张
hmset p01 c30 1000 c50 1000 c100 1000
当 c30 售出1件时,值减 1; 当 c100 售出 20 件时,值减 20,如下代码
# p01商家,商品c30售出1件
hincrby p01 c30 -1
# p01商家,商品c100售出20件
hincrby p01 c100 -20