订单下单库存设计思路

订单下单库存设计思路:

1.将商品库存存放redis,通过redis incr incrby decr decrby命令操作库存
2.操作完后发送mq消息,同步数据库库存

伪代码 1:

List<Goods> goods ;//订单的多个商品信息

List<Goods> goodsOK ;//成功减完库存的商品

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<Goods> goods ;//订单的多个商品信息
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<Goods> goods ;//订单的多个商品信息
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);
 

猜你喜欢

转载自my.oschina.net/xiaominmin/blog/1791818