日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php redis下单,redis 队列简单实现高并发抢购/秒杀

發布時間:2024/3/24 php 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php redis下单,redis 队列简单实现高并发抢购/秒杀 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

redis 隊列簡單實現高并發搶購/秒殺

2019-03-21 14:34

閱讀數 82

前提為每人限購1件

<>開搶前

把秒殺商品庫存存進 Redis 隊列中

$redis = new redis(); $redis->connect('127.0.0.1', 6379); //庫存 $num = 10;

//往隊列 goods_store 插入商品, 隊列的長度為庫存 for($i=0;$ilpush(

'goods_store', 1);

<>開搶中

方法1

前端: 用戶點擊購買按鈕進行form表單提交

后端: 執行下面代碼

//用戶等待隊列 $wait_key = "user_wait"; //庫存隊列 $store_key = "goods_store"; //根據Redis

hash特性, 設置成功返回1, 舊值被覆蓋則返回0, 用來控制同一用戶多買現象 $result = $redis->hset($wait_key,

$user_id, $user_id); if($result){ $count = $redis->lpop($store_key); if(!$count)

return '已經搶光了'; //下單流程, 數據庫入庫等操作 //下單失敗或報錯則執行 $redis->hdel($wait_key,

$user_id); 和加庫存 $redis->lpush('goods_store', 1); 并跳轉回上一頁提示下單失敗 ......

//下單成功則跳轉到相應頁面 return '搶購成功'; }

問題: 高并發下可能造成服務器壓力瞬間過大, 導致數據入庫失敗, 可將下單入庫等流程用crontab定時器異步執行

方法2

前端: 用戶點擊購買按鈕, 按鈕變灰防止用戶重復點擊, 并且彈出小窗口提示排隊中

ajax異步調用搶購接口

* 成功: js輪詢請求是否下單成功接口

* 成功: 跳轉相應頁面進行支付流程

* 失敗: 提示用戶重新進行購買流程

* 失敗: 提示用戶重新進行購買流程

搶購接口代碼

//用戶等待隊列 $wait_key = "user_wait"; //搶購成功的用戶隊列 $user_key = "user"; //庫存隊列

$store_key = "goods_store"; //根據Redis hash特性, 設置成功返回1, 舊值被覆蓋則返回0, 用來控制同一用戶多買現象

$result = $redis->hset($wait_key, $user_id, $user_id); if($result){ $count =

$redis->lpop($store_key); if(!$count) return '已經搶光了'; $redis->lpush($user_key,

$user_id); return '搶購成功'; }

crontab定時器異步執行下單入庫代碼

//用戶等待隊列 $wait_key = "user_wait"; //搶購成功的用戶隊列 $user_key = "user"; $count =

$redis->rpop($user_key); if(!$count) return; //下單流程, 數據庫入庫等操作 //下單失敗或報錯則執行

$redis->hdel($wait_key, $user_id); 和加庫存 $redis->lpush('goods_store', 1); ......

是否下單成功接口代碼

//數據庫查詢order訂單表返回是否存在未支付訂單數據

待解決:

假設用戶A流程進行到以下邏輯時

流程1.下單流程, 數據庫入庫等操作

流程2.下單失敗或報錯則執行 $redis->hdel($wait_key, $user_id); 和加庫存

$redis->lpush('goods_store', 1);

假設1由于未知錯誤導致程序崩潰, 沒有執行2就退出了, 用戶A不能重新搶購

假設1由于未知錯誤導致入庫失敗, 2在執行 $redis->hdel 失敗了, 用戶A不能重新搶購

優化:

前端靜態資源上CDN

設置nginx的最大連接數

假設秒殺商品庫存有10個, 當用戶等待隊列 user_wait 長度大于 30~100 后的請求全部過濾

添加一個延時隊列, 把下單規定時間內沒有付款的訂單取消掉, 并加庫存

附送 Redis 鎖簡易代碼

// 加鎖 $random:隨機數 $expire_time:有效時間 $lock_status = $redis->set($lock_key,

$random, array('nx', 'ex' => $expire_time)); if($lock_status){ // do something .

..... if($redis->get($lock_key) == $random){ // 解鎖 $redis->del($lock_key); } }

總結

以上是生活随笔為你收集整理的php redis下单,redis 队列简单实现高并发抢购/秒杀的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。