概述
最近在做小程序商城的时候,由于活动模式采用的是先预热加入购物车,提交订单时做库存扣减。在促销开始时客户开始大量提交订单,活动内容为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、以上纯属个人观点,有不正确的地方欢迎批评指正。
最后
以上就是帅气山水为你收集整理的电商项目高并发下库存处理redisson的全部内容,希望文章能够帮你解决电商项目高并发下库存处理redisson所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复