By东关

php+redis商城秒杀简单实现
2021-05-12

1、生成数据

<?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 = 50;
	if ($redis->lLen($redis_name) < $num) {
		$redis->rPush($redis_name, $uid);
		echo $uid . "秒杀成功"."<br>";
	} else {
		//如果当前队列人数已经达到10人,则返回秒杀已完成
		echo "秒杀已结束<br>";
	}
}
// 关闭redis连接
$redis->close();
die; 2、redis实现秒杀功能
#方案一开始
//设置redis数据库连接及键名
$redis = new Redis();
$redis->connect('127.0.0.1');
$key = 'secKill3';
//redis数据库key [注:默认redis数据库选择第0号数据库]
//PDO连接mysql数据库
$dsn = "mysql:dbname=ww;host=192.168.10.18";
$pdo = new PDO($dsn, 'root', '123456');
//死循环
//从队列最前头取出一个值,判断这个值是否存在,取出时间和uid,保存到数据库
//数据库插入失败时,要有回滚机制
//注: rpush 和lpop是一对
while(1) {
	// var_dump(1);
	//从队列最前头取出一个值
	$uid = $redis->lPop($key);
	//判断值是否存在
	if(!$uid || $uid == 'nil') {
		sleep(2);
		break;
		// 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);
	}
}
var_dump('完成');
// 生成唯一订单号
function build_order_no($uid) {
	return  substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8).$uid;
}
#方案一结束
#方案二
$redis = new redis();
$result = $redis->connect('127.0.0.1', 6379);
echo $mywatchkey = $redis->get("mywatchkey");
// var_dump(333333333);
/*
  //插入抢购数据
 if($mywatchkey>0)
 {
     $redis->watch("mywatchkey");
  //启动一个新的事务。
    $redis->multi();
   $redis->set("mywatchkey",$mywatchkey-1);
   $result = $redis->exec();
   if($result) {
      $redis->hSet("watchkeylist","user_".mt_rand(1,99999),time());
      $watchkeylist = $redis->hGetAll("watchkeylist");
        echo "抢购成功!<br/>";
        $re = $mywatchkey - 1;  
        echo "剩余数量:".$re."<br/>";
        echo "用户列表:<pre>";
        print_r($watchkeylist);
   }else{
      echo "手气不好,再抢购!";exit;
   } 
 }else{
     // $redis->hSet("watchkeylist","user_".mt_rand(1,99999),"12");
     //  $watchkeylist = $redis->hGetAll("watchkeylist");
        echo "fail!<br/>";   
        echo ".no result<br/>";
        echo "用户列表:<pre>";
      //  var_dump($watchkeylist); 
 }*/
$rob_total = 10;
//抢购数量
if($mywatchkey<=$rob_total) {
	$redis->watch("mywatchkey");
	$redis->multi();
	//在当前连接上启动一个新的事务。
	//插入抢购数据
	$redis->set("mywatchkey",$mywatchkey+1);
	$rob_result = $redis->exec();
	if($rob_result) {
		$redis->hSet("watchkeylist","user_".mt_rand(1, 9999),$mywatchkey);
		$mywatchlist = $redis->hGetAll("watchkeylist");
		echo "抢购成功!<br/>";
		echo "剩余数量:".($rob_total-$mywatchkey-1)."<br/>";
		echo "用户列表:<pre>";
		var_dump($mywatchlist);
	} else {
		$redis->hSet("watchkeylist","user_".mt_rand(1, 9999),'meiqiangdao');
		echo "手气不好,再抢购!";
		exit;
	}
}

你必须 登录 才能发表评论.

  • 还没有人留下脚印噢,快来踩踩叭