亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

php+redis搶購功能,并發問題

php+redis搶購功能,并發問題

PHP
拉風的咖菲貓 2019-03-15 08:36:11
今天嘗試寫并發搶購功能,再網上找了相關資料后,實現了如下: <?php #開始搶購,檢測庫存 $inventoryData = $this->redis->get($inventoryKey); if ($inventoryData == null) { //庫存不足 return '-1'; } #解析json $inventoryData = json_decode($inventoryData, true); #檢測庫存 if ($inventoryData['inventory'] == 0) { //庫存不足 return '-1'; } //開啟事務 $this->redis->watch($inventoryKey); //事務開始 $this->redis->multi(); //將搶購數據加入redis $this->redis->lPush('kill_goods_' . $data['goods_id'], json_encode($data)); $goodsData = ['id' => $data['goods_id'], 'inventory' => $inventoryData['inventory'] - 1]; $this->redis->set($inventoryKey, json_encode($goodsData)); $result = $this->redis->exec(); if ($result) { file_put_contents('1.txt', $inventoryData['inventory'] . PHP_EOL, FILE_APPEND); return 1; } return '-1'; 經過并發測試:始終都會有重復的,請各位大佬講解講解
查看完整描述

4 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

庫存做原子自減

查看完整回答
反對 回復 2019-03-18
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

用原子自減只能解決redis本身內的并發問題,但程序中并發處理也有問題。像Nine所說的一樣,會存在多條訪問全都通過前面的檢測。必須在php程序內做原子限制。像一些高并發下的活動頁面,根據實際業務做法有很多。像樓主的業務邏輯,我覺得首先可以讓庫存的key自減,然后直接根據返回key的值直接判斷是否小于或者等于0。

查看完整回答
反對 回復 2019-03-18
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我覺得這個問題可以不用事務解決的啊,還有原子自減string也是可以減為負的啊,難道負的庫存也合理么?這個東西用list完美解決,根本不需要事務啊

查看完整回答
反對 回復 2019-03-18
  • 4 回答
  • 0 關注
  • 448 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號