2019独角兽企业重金招聘Python工程师标准>>>
订单下单库存设计思路:
1.将商品库存存放redis,通过redis incr incrby decr decrby命令操作库存
2.操作完后发送mq消息,同步数据库库存
伪代码 1:
List
List
boolean stockFlag=true;//所有商品减库存成功表成功标志
for(Goods g : goods){
//返回减库存后的结果
int rs = redis.decrby(购买数量);
//如果减购买数量后库存数据量小于0,则下单失败
goodsOK.add(g);
if(rs < 0){
stockFlag = false;
break;
}
}
//减库存失败,增加redis库存
if(!stockFlag){
for(Goods g : goodsOK){
//返回减库存后的结果
int rs = redis.incrby(购买数量);
}
//减库存成功,发消息,同步数据库库存
}else{
mq.send(goods);
}
----------------------------------追求完美可靠------------------------
伪代码 2:通过lua脚本,对所有的商品库存原子性操作,通过事物消息,保证,发送消息和redis减库存原子性操作
List
StringBuffer luaStr = new StringBuffer();
//发事物消息
mq.send(goods);
//拼lua脚本
for(Goods g : goods){
luaStr.append("
//返回减库存后的结果
local s = redis.decrby(购买数量);
//减库存失败,增加redis库存
if(s < 0){
redis.incrby(购买数量);
return false;
}else{
return true;
}
”);
}
//实行redis lua
boolean flag = redis.eval(luaStr);
if(flag){
//确定事物消息
mq.send(goods);
}else{
//回滚事务消息
mq.send(goods);
}
----------------------------------追求性能------------------------
伪代码 2:通过lua脚本,对所有的商品库存原子性操作,通过事物消息,保证,
List
StringBuffer luaStr = new StringBuffer();
//拼lua脚本
for(Goods g : goods){
luaStr.append("
//返回减库存后的结果
local s = redis.decrby(购买数量);
//减库存失败,增加redis库存
if(s < 0){
redis.incrby(购买数量);
return false;
}else{
return true;
}
”);
}
//实行redis lua
boolean flag = redis.eval(luaStr);