电商项目高并发下库存处理redisson

最近在做小程序商城的时候,由于活动模式采用的是先预热加入购物车,提交订单时做库存扣减。在促销开始时客户开始大量提交订单,活动内容为10件2.5折。顾客购物车商品重合度较高。且并发量特别大(日PV破千万),原来的库存扣减采用的是数据库幂等模式:即 : 提交订单时先查询数据库库存。再做库存判断,满足条件时,采用sql:

update inventory set inventory_num=inventory_num-count where inventory_num>=count;

结果由于并发量太大,导致出现很严重的锁等待问题。提交订单速度极慢。

后经过研究,决定采用redisson 对库存做处理。

首先将每个sku的库存缓存进数据库,在客户提交订单的时候,获取redisson的连锁RedissonMultiLock,将客户整个购物车内的商品作为一个整体,获取到连锁 rLock。如果rLock锁定失败,则返回错误。提示客户当前提交订单人数过多,稍后重试。获取锁成功后,开始对购物车内商品库存做出验证。验证通过,则扣除redis库存。释放连锁。并且封装出库存变动的消息,通过MQ通知到系统,对数据库库存进行有序更新。

实践证明,该方法有效,提交订单效率大大提高。单小时销售额突破800W。

注意事项:

1、RedissonMultiLock 获取锁的原理

RedissonMultiLock 是由单个锁RLock组成的,单锁获取时的 key 要和sku库存缓存用的key区分开。RLock的原理是根据当前线程号和服务器的其他信息生成一个唯一的值。然后根据获取单锁时传入的key向redis内插入信息。在释放锁时会将该key的值清空。这样就可以获取到新锁。刚做的时候,由于对RLock理解不深,单锁获取的key和sku缓存库存的key重复了,出了很多问题。

2、数据库库存仍需更新

数据库库存更新时,采用MQ,将并发转换为异步处理,数据库完全没有问题

3、取消订单返还库存,要返还进redis 并且数据库库存仍采用MQ通知消息来更新

4、所有对redis内库存的操作,必须在获取到锁并且加锁成功的情况下进系

5、以上纯属个人观点,有不正确的地方欢迎批评指正。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值