我以前讨论过抢购的库存问题,我听到很多人的实现方式是得用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
}
}
上面是我设想的一段锁库存与减库存的伪代码,实际中,可能要考虑更多因素,以后我有时间实现一个。