关于抢购的狂想二

我以前讨论过抢购的库存问题,我听到很多人的实现方式是得用redis加上lua实现计数操作。据说redis每秒两万次的操作不成问题。但问题是数据传输也需要时间。我以为能在本地解决就决不通过数据库解决。以下我的一个解决方案,在我看来没有百分百完美的方案,有好就有坏。

1.库存表中(或商品表中)设如下字段:剩余数量,锁定数量
2.用户下单时,向业务实例申请锁定资源
3.业务检查本地实例资源是否够用,如果不够,向数据库申请若干资源(将锁定数量加上申请数量)
4.扣除本地资源

以下是伪代码

class Stock{

		AtomicInteger counter = new AtomicInteger();
		
		public lock(int i){
			int remain = counter.get();
			if(remain == 0){
			  	i = "update 商品表 set 锁定数量 = 锁定数量 + 100 where 剩余数量 >= 锁定数量 + i"
			  	if(i != 0){
					counter.increase(100}
				remain = 100;
			}
			int newRemain = remain -i;
			counter.compareAndSet(newRemain,remain)
			
	   }

		public reduceCount(int i){
			execute update 商品表 set 锁定数量 = 锁定数量-1  and 剩余数量-1   where 剩余数量 > 0
		}
}

上面是我设想的一段锁库存与减库存的伪代码,实际中,可能要考虑更多因素,以后我有时间实现一个。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值