秒殺專案(6)介面優化

2021-09-27 01:48:14 字數 3167 閱讀 8492

二、具體實現

三、秒殺和rabbitmq結合

需要實現initializingbean 介面,重寫afterpropertiesset()方法

public class miaoshacontroller implements initializingbean 

for(goodsvo goodsvo : goodsvos)

}}

if(miaoshauser == null)
原來是直接去資料庫查詢庫存是否足夠秒殺,秒殺則直接秒殺。現在是在redis中找到商品的庫存資訊,進行預減庫存。

//預減庫存

long count = redisservice.decr(goodskey.bygoodsstock,""+goodsid);

if(count < 0)

根據商品的id和當前使用者登入的id從換快取中和資料庫中查詢,看是否生成訂單,來判斷是否重複秒殺

goodsvo goodsvo = goodsservice.seleterefergoods(goodsid);

orderinfo orderinfo = null;

orderinfo orderinfo1 = redisservice.get(miaoshaorderkey.orderbymanyid, "" + miaoshauser.getid() + goodsvo.getid(), orderinfo.class);

if(orderinfo1 != null)else

if(orderinfo != null)

public class miaoshamsg
先將秒殺資訊轉換為jso格式的字串,然**隊,秒殺實現在訊息佇列的服務端

@service

public class rabbitmqsend

}

@rabbitlistener(queues = mqconfig.queue1)

public string receive(string str, model model)

//2.判斷是否重複秒殺

//3.判斷是否重複秒殺

//先從快取中取

orderinfo orderinfo = null;

orderinfo orderinfo1 = redisservice.get(miaoshaorderkey.orderbymanyid, "" + miaoshauser.getid() + goodsvo.getid(), orderinfo.class);

if(orderinfo1 != null)else

if(orderinfo != null)

"步驟3");

//4.減庫存,下訂單,寫入秒殺訂單,需要在事務中操作

orderinfo miaoshaorderinfo = miaoshaservice.realmiaosha(miaoshauser, goodsvo);

model.addattribute("orderinfo",miaoshaorderinfo);

model.addattribute("goods",goodsvo);

"步驟4");

//5.秒殺成功,存入redis中

redisservice.set(miaoshaorderkey.orderbymanyid,""+miaoshauser.getid() + goodsvo.getid(),orderinfo);

log.info("id是: " + miaoshamsg.getuser().getid() + "的使用者秒殺了商品id為" + miaoshamsg.getgoodsid() + "的商品" );

return "order_detail";

}

作用:提示商品已經秒殺光了,這樣服務端在處理訊息時就很可以直接返回秒殺失敗。

實現:通過判斷資料庫減少乙個數量後,商品的庫存是否為負數來判斷

//減少庫存,goods表的庫存得減少,miaoshagoods表的庫存也得減少

orderinfo orderinfo = null;

if( goodsvo.getstockcount()<= 0)

通過result來返回處理的結果:

@responsebody

public resultmiaosharesult(model model,miaoshauser miaoshauser,@requestparam("godsid")long goodsid)

long result = miaoshaservice.getmiaosharesult(miaoshauser.getid(),goodsid);

return result.success(result);

}秒殺成功返回商品的id,失敗返回-1,正在處理返回0;

//秒殺成功返回商品id

//失敗返回-1

//正在處理返回0

public long getmiaosharesult(long id, long goodsid) else else

}}

在每次的業務邏輯,都需要去redis中取庫存的資訊,即使庫存不足,也要去redis中訪問庫存的資訊,記憶體標誌的作用就是使庫存不足時,就不去redis中預減庫存了。

系統初始化的時候設定乙個標誌,存到map中

for(goodsvo goodsvo : goodsvos)
預減庫存之前先去map中判斷標誌

boolean flag = (boolean) map.get(goodsid);

if(flag)

庫存不足,設定標誌

if(count < 0)

九 介面總結

1,介面和抽象類讓實現和定義實現分離 2.抽象類 抽象類用abstract修飾,可包含抽象方法,和普通方法,其中抽象方法只是宣告了存在乙個方法,但不知道具體怎麼做 抽象方法 方法只有宣告沒有方法體,使用abstract進行修飾,只是宣告了乙個方法 如果乙個類有1個或多個抽象方法,那麼該類一定是抽象類...

11 介面總結

定義介面的基本格式 外層的框架 public inte ce 介面名稱 常量 public static final 資料型別 常量名稱 資料值 抽象方法 public abstract 返回值型別 方法名稱 引數列表 沒有大括號 預設方法 public default 返回值型別 方法名稱 引數列...

1394介面介紹

1394介面,又稱 火線 firewire 最早是有美國蘋果公司開發用於計算機網路互聯的介面,由於其一系列特點被現在數 碼攝像機廣泛利用,用以將數碼產品與計算機的連線以及機器之間的連線。介面具有以下特點 1.廉價 介面硬體成本很低,現在一塊 介面的 卡還不到 元。2.速度快 現在標準的 介面最高傳輸...