業務
商品有庫存, 如10000 每買乙個商品 庫存就減一減庫存可以通過mysql來實現 如
update product_stock set stock = stock - 1 where product_id = 1 and stock > 0;
也可以使用redis來實現 如
decr 1_stock
(integer) 99
面對這種場景都說要使用redis
因為redis
併發效能更好 想實際驗證一下是否這樣
思路
設定較大的併發數去更新庫存 執行10次 比較redis和mysql花費的時間**
@autowired
private jdbctemplate jdbctemplate;
@bean
jedisconnectionfactory jedisconnectionfactory()
@bean
redistemplateredistemplate()
public static void main(string args)
//mysql減庫存任務
private callableupdatestockinmysqltask = () -> ;
//redis減庫存任務
private callableupdatestockinredistask = () ->
});return null;
};@override
public void run(string... args) throws exception
system.out.println(timelist.stream().collect(collectors.summarizinglong(t -> t))); //輸出統計結果
}private void concurrentupdatestock(string name) throws interruptedexception
list> futurelist = pool.invokeall(tasks); //併發去執行這些任務
while (futurelist.stream().anymatch(f -> !f.isdone())); //等待任務執行完
pool.shutdown();
}} 輸出結果
mysql:
longsummarystatistics
redis:
longsummarystatistics
結果
併發執行1000次減庫存操作 mysql要比redis慢差不多7倍
減庫存方式
在正常的電商平台購物場景中,使用者的實際購買過程一般分為兩步 下單和支付。其中減庫存操作一般有如下3個方式 秒殺系統一般採用 下單減庫存 邏輯上更為簡單,效能上也更佔優勢。即當買家下單後,在商品的總庫存中減去買家購買數量。下單減庫存是最簡單的減庫存方式,也是控制最精確的一種,下單時直接通過資料庫的事...
mysql 使用樂觀鎖減庫存
方法1 update t goods set num num where id and num 0 and status 1方法2 update t goods set num num where id and num and status 1不建議使用版本號更新的方式 版本號的方法並不是適用於所有...
redis預減庫存 rabbitmq非同步下單
減緩存 新增佇列 responsebody domiaosha public resultbean findall requestparam goodsid long goodsid,pathvariable string path,user user,long addresssid throws ...