併發減庫存 redis vs mysql

2021-09-19 11:06:51 字數 1416 閱讀 9762

業務

商品有庫存, 如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 ...