处理产品超卖的一种思路(来讨论讨论)
阻止并发下的产品超卖思路是利用redis串行处理数据,但又有高并发处理数据的能力
产品表(product)
class Product
{
public int Id{get;set} //自增Id
public string Name{get;set}//产品名称
public int Number{get;set}//库存
public DateTime NTime{get;set;}//库存同步时间
....
}
库存变更记录表(productNumberRecord)
class productNumberRecord
{
public int Id{get;set;}
public int Number{get;set;} //本次消耗库存数量
public int SurplusNumber{get;set} //本次消耗后的剩余数量
public DataTime Time{get;set;} //记录时间
....
}
1.将产品Id,库存存入redis,每次操作产品库存,则产生一条库存的变更记录存入sql库中
2.此时sql库产品的实际库存应该是 库存=库存-库存记录(大于NTime时间的记录)
3.sql库中的余额,可以做定时任务 按天或小时数进行同步,防止过大的记录造成select超时
4.如果redis挂掉,那么它将从数据库中 按照步揍2的方式同步库存
伪代码实现(不加锁)
(开始事务){
try{
func1(插入变更记录表);
如果func1 执行失败 直接跳出
func3 ...
func4 ...
等其他业务
funcX(增减redis库存)
如果funcX执行失败,直接跳出,不插入日志
如果都成功 则提交事务
catch{
tran.callback()//事务回滚
}
}
上一篇: 那也很大了好不好