使用Mysql和Redis設計搶購邏輯

2022-04-03 06:23:06 字數 1440 閱讀 8572

搶購場景中,要保證兩點:

1.庫存不會超減/少賣

2.在1基礎上的執行速度

我測試了兩種方案,

方案一.mysql開啟事務,獲取庫存時使用獨佔鎖阻塞其他讀請求.

我把庫存表簡單設計如下

create

table

`la_store` (

`id`

int(11) not

null

, `val`

int(255) not

null,

primary

key(`id`)

) engine

=innodb default charset=utf8mb4;

假設庫存有100000件(val=100000)

php邏輯**

<?php

$stime=microtime(true

);$count=100000;//測試次數

while($count>0)

mysql_select_db("database_name", $con

);mysql_query('begin');

$record=mysql_query("select * from la_store where id = 1 for update");//

獲取獨佔鎖

$record=mysql_fetch_array($record

);if($record['val']>0)else

mysql_query("commit");

mysql_close($con);}

$etime=microtime(true);//

獲取程式執行結束的時間

$total=$etime-$stime

;echo

$total;

方案二.使用redis開啟事務

假設庫存有100000件(set store 100000)

<?php

$stime=microtime(true

);//開始時間

$count=100000;//測試次數

while($count>0)else

}$etime=microtime(true);//

獲取程式執行結束的時間

print_r($res

);$total=$etime-$stime

;echo

$total;

測試結果:

分別執行,經過100000次迴圈後,redis用時22秒,mysql用時50秒;

使用redis更快,但redis的事務不能回滾,如果業務邏輯出錯時允許不回滾,並且回滾的概率很小,建議使用redis.如果邏輯出錯時必須回滾,還是用mysql更穩妥.

MySQL(七) 索引的設計和使用

索引是資料庫中用來提高效能的最常用工具,下面簡單介紹一下索引的型別和設計原則。常用引擎的索引方式 特點 myisam innodb memory merge b樹索引 支援 預設 支援 預設 支援支援 雜湊索引 支援 預設 全文索引 支援字首索引 支援支援 索引在建立表的時候可以同時建立,也可以隨時...

redis 快取設計和優化

加速讀寫 降低後端負載 資料不一致 維護成本更高 多了一層快取邏輯 運維成本 redis cluster 降低後端負載 對高消耗的運算結果進行快取 加速請求響應 i 0 大量寫合併為批量寫 先累計在db持久化 lru lfu fifo演算法剔除 maxmemory policy 超時剔除 expir...

redis安裝和使用

1 安裝redis 上傳檔案到固定目錄下 版本為 redis 3.2.0 tar xzvf redis 3.2 0.tar gzcd redis 3.2 0make make install2 啟動redis redis server redis.conf3 一般不會在原配置檔案上進行修改,原配置檔...