今天嘗試寫并發(fā)搶購功能,再網(wǎng)上找了相關(guān)資料后,實(shí)現(xiàn)了如下:
<?php
#開始搶購,檢測庫存
$inventoryData = $this->redis->get($inventoryKey);
if ($inventoryData == null) {
//庫存不足
return '-1';
}
#解析json
$inventoryData = json_decode($inventoryData, true);
#檢測庫存
if ($inventoryData['inventory'] == 0) {
//庫存不足
return '-1';
}
//開啟事務(wù)
$this->redis->watch($inventoryKey);
//事務(wù)開始
$this->redis->multi();
//將搶購數(shù)據(jù)加入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';
經(jīng)過并發(fā)測試:始終都會有重復(fù)的,請各位大佬講解講解
php+redis搶購功能,并發(fā)問題
拉風(fēng)的咖菲貓
2019-03-15 08:36:11