利用redis List队列简单实现秒杀 PHP代码实现
2018年05月28日 11:37:46 m_nanle_xiaobudiu 阅读数 35674更多
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一 生产者producer部分
--------------------------------producer 部分注释------------------------------------------------------------
用户在页面请求之后, 获取到用户uid , 跳转到这个加入队列的方法 (这里直接在producer中模拟了多个uid)
在方法内部判断redis队列长度是否已经达到要求, 如果没有超出, 则执行加入队列的操作 (这里为了简洁,没有封装成方法)
注: producer.php没有进行数据库的操作,只有接受uid和其他值的操作, 数据库操作一律放在消费者consumer.php中
--------------------------------producer 注释结束-----------------------------------------------------------------------
生产者代码 producer.php:
-
-
-
-
-
$redis->connect(‘127.0.0.1‘,6379);
-
$redis_name = ‘secKill3‘;
-
-
-
for ($i = 0; $i < 100; $i++) {
-
$uid = rand(10000000, 99999999);
-
-
-
if ($redis->lLen($redis_name) < $num) {
-
$redis->rPush($redis_name, $uid);
-
echo $uid . "秒杀成功"."<br>";
-
-
-
-
-
-
-
-
注: 执行完producer.php文件,本地redis数据库第0号数据库中应该有一个键名为"secKill3"的List队列,像这样

二 消费者consumer部分
------------------------------消费者部分注释---------------------------------------------
消费者一直读取redis数据库中指定队列,一有值,立即取出,并进行相应数据库操作
------------------------------消费者部分注释结束----------------------------------------
消费者代码 consumer.php
-
-
-
-
-
$redis->connect(‘127.0.0.1‘);
-
-
-
-
$dsn = "mysql:dbname=test;host=127.0.0.1";
-
$pdo = new PDO($dsn, ‘root‘, ‘123456‘);
-
-
-
-
-
-
-
-
-
$uid = $redis->lPop($key);
-
-
if(!$uid || $uid == ‘nil‘){
-
-
-
-
-
$orderNum = build_order_no($uid);
-
-
-
-
$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);
-
-
-
$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
-
-
`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,
-
-
) ENGINE = MyISAM default charset=utf8;