本实例使用thinkphp5
//创建数据库
CREATE TABLE `think_order_queue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL COMMENT '订单id',
`mobile` varchar(255) CHARACTER SET utf8mb4 DEFAULT '0' COMMENT '手机号',
`created_at` int(11) DEFAULT NULL COMMENT '创建时间',
`updated_at` int(11) DEFAULT NULL,
`status` tinyint(2) DEFAULT NULL COMMENT '0未处理,1已处理,2处理中',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='订单队列表';
//创建模型
namespace appcommonmodel;
use thinkModel;
class OrderQueue extends Model{
}
//生成订单
public function orderQueue(){//订单id
$order_id = rand(10000, 99999);//生成的订单信息
$insert_data = array(
'order_id' => $order_id,
'mobile' => 1857523452 . rand(1, 9),
'created_at'=> time(),
'status' => 0,
);
$result = model('order_queue')->save($insert_data);
if(!$result){
return '保存失败';
}
return "保存成功!";
}
//配送系统处理队列中的订单
public function orderProcess(){
$waiting = array('status'=>0); //未处理
$lock = array('status'=>2); //改为等待中 //处理数据更新为等待状态
$res_lock = model('order_queue')->where($waiting)->order('id asc')->update($lock);//选择更新的数据进行配送
if($res_lock){
$success = array('status'=>1, 'updated_at'=>time());
$result = model('order_queue')->where($lock)->update($success);
if(!$result){
return 'error';
}
return 'success';
}
return '处理失败';
}
CREATE TABLE `redis_queue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) DEFAULT NULL,
`time_stamp` varchar(50) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '微秒时间戳',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='redis秒杀';
//thinkphp5 thinkcachedirverRedis.php默认没有lpush,lLen等方法,要自己添加
public function lLen($key){
return $this->handler->lLen($key);
}
public function lPush($key,$value){
return $this->handler->lPush($key, $value);
}
public function rPush($key,$value){
return $this->handler->rPush($key, $value);
}
public function lpop($key){
return $this->handler->lPop($key);
}
public function close(){
return $this->handler->close();
}
//接受用户请求
public function orderRedis(){//thinkphp5 redis默认没有lpush,lLen等方法,要自己添加
$redis = new cachedriverRedis();
$redis_name = "miaosha";
for($i&#61;0; $i<100; $i&#43;&#43;){
$uid &#61; rand(1000, 10000);
$num &#61; 10;//如果当天人数少于10的时候&#xff0c;则加入这个队列
if($redis->lLen($redis_name) <10){
//微秒
$redis->rPush($redis_name, $uid . &#39;%&#39; . microtime());
echo $uid . &#39;秒杀成功&#39;;
} else {//如果当天人数达到10个人&#xff0c;则返回秒杀已完成
echo &#39;秒杀已结束&#39;;
}
}
$redis->close();
}
//处理redis请求
public function redisQueue(){
$redis &#61; new cachedriverRedis();
$reids_name &#61; &#39;miaosha&#39;;//死循环
while(1){//从队列最左侧取出一个值
$user &#61; $redis->lpop($reids_name);//然后判断这个值是否存在
if(!$user || $user &#61;&#61; &#39;null&#39;){sleep(1);
exit();
}//切割事件&#xff0c;uid
$user_arr &#61; explode(&#39;%&#39;, $user);
$insert_data &#61; array(
&#39;uid&#39; &#61;> $user_arr[0],
&#39;time_stamp&#39; &#61;> $user_arr[1],
);//保存到数据库中
$res &#61; model(&#39;redis_queue&#39;)->insert($insert_data);//数据库插入失败的时候回滚机制
if(!$res){
$redis->rPush($reids_name, $user);
}sleep(1);
}//释放redis
$redis->close();
}