PHP redis秒杀场景队列使用
2019-08-03 本文已影响11人
vins
1:将用户加入队列
<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redisName = "miaosha";
for($i = 0; $i < 100; $i++){
//接收用户的uid
$uid = rand(1,999999);
//规定抢购的数量
$num = 10;
//如果少于10则加入这个队列
if($redis->lLen($redisName) < 10){
$redis->rPush($redisName,$uid.'%'.microtime());
echo $uid."秒杀成功"."<br>";
}else{
echo "秒杀已经结束"."<br>";
}
}
$redis->close();
?>
2.停止秒杀活动 操作队列将信息刷到mysql中
<?php
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='test'; //使用的数据库
$user='root'; //数据库连接用户名
$pass='123456'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
$dbh = new PDO($dsn, $user, $pass);
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$redisName = "miaosha";
//死循环
while(1){
//队列左侧取值
$user = $redis->lPop($redisName);
//判断值是否存在
if(!$user || $user == 'nil'){
sleep(2);
continue;
}
//切割时间
$userArr = explode('%',$user);
$uid = $userArr[0];
$time = date("Y-m-d H:i:s",time());
$res = $dbh->query("INSERT INTO redis (id,uid,time) VALUES (NULL,$uid,'$time')");
//如果失败 丢回队列
if(!$res){
$redis->rPush($redisName,$uid);
}
sleep(2);
}
//释放redis
$redis->close();