数据库|订单下单库存设计思路
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);
转载于:https://my.oschina.net/xiaominmin/blog/1791818
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 数据库设计与优化
- 数据库总结语句
- MySql数据库备份与恢复
- 数据库|SQL行转列方式优化查询性能实践
- MySQL数据库的基本操作
- springboot整合数据库连接池-->druid
- Android|Android sqlite3数据库入门系列
- Python3|Python3 MySQL 数据库连接
- 达梦数据库|DM8表空间备份恢复