利用redis List隊列簡單實現秒殺 PHP代碼實現

一 生產者producer部分

?

--------------------------------producer 部分注釋------------------------------------------------------------

用戶在頁面請求之后, 獲取到用戶uid , 跳轉到這個加入隊列的方法 (這里直接在producer中模擬了多個uid)

在方法內部判斷redis隊列長度是否已經達到要求, 如果沒有超出, 則執行加入隊列的操作 (這里為了簡潔,沒有封裝成方法)

注: producer.php沒有進行數據庫的操作,只有接受uid和其他值的操作, 數據庫操作一律放在消費者consumer.php中

--------------------------------producer 注釋結束-----------------------------------------------------------------------

?

生產者代碼 producer.php:

<?php//連接redis數據庫
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redis_name = 'secKill3';//模擬100人請求秒殺(高壓力)
for ($i = 0; $i < 100; $i++) {$uid = rand(10000000, 99999999);//獲取當前隊列已經擁有的數量,如果人數少于十,則加入這個隊列$num = 10;if ($redis->lLen($redis_name) < $num) {$redis->rPush($redis_name, $uid);echo $uid . "秒殺成功"."<br>";} else {//如果當前隊列人數已經達到10人,則返回秒殺已完成echo "秒殺已結束<br>";}
}
//關閉redis連接
$redis->close();

?

?

?

注: 執行完producer.php文件,本地redis數據庫第0號數據庫中應該有一個鍵名為"secKill3"的List隊列,像這樣

?

?

二 消費者consumer部分

?

------------------------------消費者部分注釋---------------------------------------------

消費者一直讀取redis數據庫中指定隊列,一有值,立即取出,并進行相應數據庫操作

------------------------------消費者部分注釋結束----------------------------------------

?

消費者代碼 consumer.php

?

<?php//設置redis數據庫連接及鍵名
$redis = new Redis();
$redis->connect('127.0.0.1');
$key = 'secKill3';//redis數據庫key [注:默認redis數據庫選擇第0號數據庫]//PDO連接mysql數據庫
$dsn = "mysql:dbname=test;host=127.0.0.1";
$pdo = new PDO($dsn, 'root', '123456');//死循環
//從隊列最前頭取出一個值,判斷這個值是否存在,取出時間和uid,保存到數據庫
//數據庫插入失敗時,要有回滾機制
//注: rpush 和lpop是一對while(1) {//從隊列最前頭取出一個值$uid = $redis->lPop($key);//判斷值是否存在if(!$uid || $uid == 'nil'){sleep(2);continue;}//生成訂單號$orderNum = build_order_no($uid);//生成訂單時間$timeStamp = time();//構造插入數組$user_data = array('uid'=>$uid,'time_stamp'=>$timeStamp,'order_num'=>$orderNum);//將數據保存到數據庫$sql = "insert into student (uid,time_stamp,order_num) values (:uid,:time_stamp,:order_num)";$stmt = $pdo->prepare($sql);$res = $stmt->execute($user_data);//數據庫插入數據失敗,回滾if(!$res){$redis->rPush($key,$uid);}
}//生成唯一訂單號
function build_order_no($uid){return  substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8).$uid;
}

?

?

?

注: 執行完consumer.php之后,數據庫對應數據表應該有數值

?

到此,秒殺結束

?

備注:

用到的student數據表結構sql

?

CREATE TABLE `student`  (`uid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'uid',`username` varchar(20) NOT NULL DEFAULT '',`time_stamp` int(11) NOT NULL DEFAULT 0,`order_num` bigint(20) UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY (`uid`) USING BTREE,key (time_stamp)
) ENGINE = MyISAM default charset=utf8;

?

?

?

 

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282387.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Filezilla 與 linux遠程服務器傳輸文件時,設置默認打開編輯器

1. 點擊編輯 2. 選擇設置&#xff0c;點擊文本編輯 3. 設置編輯器目錄 4. 確定作用&#xff1a; 這樣設置之后&#xff0c;可以實現在遠程站點欄直接下載并使用phpstorm編輯的作用 正常需要下載之后&#xff0c;再去本地相應下載目錄打開&#xff0c;然后再進行上傳文件&#x…

SDOI2017 新生舞會

01規劃 a1a2a3...ai/b1b2b2..bi最大 設一個k 使得 a1a2a3...ai/b1b2b3...bi>k 變換式子得到 a1a2a3...ai>(b1b2b3..bi)*k a1-b1*ka2-b2*ka3-b3*k...ai-bi*k>0 ai-bi*k即流量 最大費用流二分答案 來&#xff0c;上代碼&#xff1a; #include <cmath> #include &l…

在 .NET 中使用 FluentValidation 進行參數驗證

不用說&#xff0c;參數驗證很重要&#xff0c;無效的參數&#xff0c;可能會導致程序的異常。如果使用Web API或MVC頁面&#xff0c;那么可能習慣了自帶的規則驗證&#xff0c;我們的控制器很干凈&#xff1a;public class User {[Required]public string FirstName { get; se…

在win10系統下怎樣快速切換任務視圖

2019獨角獸企業重金招聘Python工程師標準>>> 切換窗口&#xff1a;Alt Tab 任務視圖&#xff1a;Win Tab (松開鍵盤界面不會消失) 切換任務視圖&#xff1a;Win Ctrl 左/右 創建新的虛擬桌面&#xff1a;Win Ctrl D 關閉當前虛擬桌面&#xff1a;Win Ctrl F4…

uwp應用在debug模式下運行正常,編譯為release版本的時候拋出異常

原因是在代碼中使用了dynamic關鍵字&#xff0c;導致release時.net native優化了代碼造成元數據丟失 所以在代碼中要盡量不用dynamic。轉載于:https://www.cnblogs.com/poison/p/7532142.html

Linux上搭建Samba,實現windows與Linux文件數據同步

一 環境介紹 1. 本地win10 2. Linux (centos7.4) 注&#xff1a;因為運營商方面禁止smb協議&#xff0c;導致無法在云服務器上使用smb&#xff0c;如果不是在虛擬機上操作&#xff0c;而是在云服務器上操作&#xff0c;建議還是使用 filezillaxshell組合 或者 使用finalshell等…

A5-1和DES兩個加密算法的學習

A5-1加密算法 1、基本原理 A5-1加密算法是一種流password&#xff0c;通過密鑰流對明文進行加密。然后用密鑰流進行對密文的解密操作。 這樣的算法主要用于GSM加密。也就是我們平時打電話的時候。通信數據發送到基站&#xff0c;基站發送到還有一個基站&#xff0c;基站發送到接…

從0到1簡易區塊鏈開發手冊V0.3-數據持久化與創世區塊

Author: brucefeng Email: brucefengbrucefeng.com 編程語言:Golang 1.BoltDB簡介 Bolt是一個純粹Key/Value模型的程序。該項目的目標是為不需要完整數據庫服務器&#xff08;如Postgres或MySQL&#xff09;的項目提供一個簡單&#xff0c;快速&#xff0c;可靠的數據庫。 Bolt…

ELK之elasticsearch5.6的安裝和head插件的安裝

這里選擇的elasticsearch為5.6的新版本&#xff0c;根據官方文檔有幾種暗裝方式&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html 這里選擇rpm包安裝https://www.elastic.co/guide/en/elasticsearch/reference/curre…

Nginx 基礎(一)

一 、Nginx簡述 Nginx是一個開源、高性能、可靠的HTTP中間件、代理服務。二 、常見的HTTP服務 1. HTTPD-Apache基金會 2. IIS-微軟 3. GWS-Google 4. Nginx三、為什么選擇Nginx 原因一&#xff1a;IO多路復用epoll &#xff08;主要解決了并發性的問題&#xff09; 注1&#xf…

Ajax基本案例詳解之load的實現

Ajax的load實現&#xff1a; 看這篇之前建議大家去看看前面兩篇文章&#xff1a; 1.Ajax基本案例詳解之$.ajax的實現 2.Ajax基本案例詳解之$.get的實現 現在寫一下$.load()里面的主要內容&#xff1a; $("#semail").load("doindex.jsp","email1&q…

ASP.NET Core高性能服務器HTTP.SYS

如果我們只需要將ASP.NET CORE應用部署到Windows環境下&#xff0c;并且希望獲得更好的性能&#xff0c;那么我們選擇的服務器類型應該是HTTP.SYS。Windows環境下任何針對HTTP的網絡監聽器/服務器在性能上都無法與HTTP.SYS比肩。[本文節選《ASP.NET Core 6框架揭秘》第18章]一、…

神經網絡- receptive field

記錄一下感受野的理解&#xff1a; 在神經網絡中&#xff0c;感受野的定義是&#xff1a; 神經網絡的每一層輸出的特征圖&#xff08;Feature ap&#xff09;上的像素點在原圖像上映射的區域大小。 1. 神經網絡中&#xff0c;第一個卷積層的 感受野大小&#xff0c;就等于filt…

734. [網絡流24題] 方格取數問題 二分圖點權最大獨立集/最小割/最大流

問題描述&#xff1a;在一個有m*n 個方格的棋盤中&#xff0c;每個方格中有一個正整數。現要從方格中取數&#xff0c;使任意2 個數所在方格沒有公共邊&#xff0c;且取出的數的總和最大。試設計一個滿足要求的取數算法。編程任務&#xff1a;對于給定的方格棋盤&#xff0c;按…

Nginx 基礎 ( 二)

一、HTTP請求 http請求包括客戶端請求服務端 以及 服務端響應數據回客戶端&#xff0c;如下 請求&#xff1a;包括請求行、請求頭部、請求數據 響應&#xff1a;包括狀態行、消息報頭、響應正文 比如在Linux中curl請求網站獲取請求信息和響應信息 curl -v http://www.kugou.com…

《金融行業應用解決方案白皮書》發布,金融自主創新未來可期!

日前&#xff0c;以“聚勢賦能 行業共創”為主題的金融行業解決方案發布會在線上舉行。麒麟軟件發布《金融行業應用解決方案白皮書》&#xff0c;并發起成立“金融機具生態圈俱樂部”&#xff0c;助力金融行業用戶高質量發展。金融信息系統曾經被國外廠商壟斷金融信息系統作為國…

leetcode53 Maximum Subarray 最大連續子數組

題目要求 Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [-2,1,-3,4,-1,2,1,-5,4], the contiguous subarray [4,-1,2,1] has the largest sum 6.即&#xff1a;尋找數列中的一個子…

黑馬程序員-WEB前端與移動開發就業班

Web前端 — IT互聯網的“門面”有人的地方就有江湖&#xff0c;有網站的地方就有Web前端&#xff0c;無所不用&#xff0c;互聯網大勢所在。課程循序漸進&#xff0c;技術小白課快速上手課程結構由淺入深&#xff0c;基礎課程講解充分&#xff0c;了解網頁的結構組成、分析頁面…

詳解go語言的array和slice 【二】

上一篇 詳解go語言的array和slice 【一】已經講解過,array和slice的一些基本用法&#xff0c;使用array和slice時需要注意的地方&#xff0c;特別是slice需要注意的地方比較多。上一篇的最后講解到創建新的slice時使用第三個索引來限制slice的容量&#xff0c;在操作新slice時…

詳解Objective-C的meta-class

2019獨角獸企業重金招聘Python工程師標準>>> 比較簡單的一篇英文&#xff0c;重點是講解meta-class。翻譯下&#xff0c;加深理解。 原文標題&#xff1a;What is a meta-class in Objective-C? 原文地址&#xff1a;http://www.cocoawithlove.com/2010/01/what-is…