处理产品超卖的一种思路(来讨论讨论)

阻止并发下的产品超卖思路是利用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()//事务回滚
}

努力、努力、加油!
原文地址:https://www.cnblogs.com/yunfan404/p/9418706.html