redis 简单使用队列
小白 2020-12-10 【原创文章】
tp5.1+rdis+720 秒杀并发处理
不啰嗦 简单上代码
/** * 访问产品前先将当前产品库存队列 * @access public * @author bieanju */ public function _before_detail(){ $where [ 'goods_id' ] = 1; $where [ 'start_time' ] = array ( "lt" ,time()); $where [ 'end_time' ] = array ( "gt" ,time()); $goods = db( "goods" )->where( $where )->field( 'goods_num,start_time,end_time' )->find(); if(!$goods){ return '当前秒杀已结束'; } if ( $goods [ 'goods_num' ] > 0){ $redis = new Redis(); $user_queue_key = 'user_list_key';//用户抢购列表key $goods_number_key = 'goods_number_key';//商品列表key //获取秒杀购买用户数量 $getUserRedis = $redis ->hGetAll($user_queue_key); //获取商品队列 $gnRedis = $redis ->llen($goods_number_key); /* 如果没有会员进来 商品队列空 则 把商品加入redis列表中 */ if (! count ( $getUserRedis ) && ! $gnRedis ){ //商品加入redis列表中 for ( $i = 0; $i < $goods [ 'goods_num' ]; $i ++) { $redis ->lpush($goods_number_key , $i); } } $resetRedis = $redis ->llen($goods_number_key); //如果商品还没加入,报下面错误 if (! $resetRedis ){ $this ->error( "系统繁忙,请稍后抢购!" ); } } else { $this ->error( "当前产品已经秒杀完!" ); } }
/** * 抢购商品前处理当前会员是否进入队列 * @access public * @author bieanju */ public function goods_number_queue(){ $user_queue_key = 'user_list_key';//用户抢购列表key $goods_number_key = 'goods_number_key';//商品列表key //传入条件 $where[] = ['id','=',1]; $goods_info = db('商品库') ->where( $where )->find(); if(! $goods_info){ return '对不起当前商品不存在或已下架'; } /* redis 队列 */ $redis = new Redis(); /* 进入队列 */ $goods_number_key = $redis ->llen($goods_number_key); //去查秒杀记录改用户是否有 if (! $redis ->hGet($user_queue_key,session('uid'))) { //没有减去商品队列--1 $goods_number_key = $redis ->lpop($goods_number_key); } if ( $goods_number_key ){ // 判断用户是否已在队列 if (! $redis ->hGet($user_queue_key,session('uid'))) { // 插入抢购用户信息 $userinfo = array ( "user_id" => $this ->user_id, "create_time" => time() ); $redis ->hSet( $user_queue_key, session('uid'), serialize( $userinfo )); return '秒杀成功'; } else { //查询订单表 $cartlist = db('订单表') ->where(['uid'=>session('uid')])-> count (); if ( $cartlist > 0){ return '秒杀成功'; } else { return '秒杀失败'; } } } else { return '系统繁忙,请重试'; } }
上面是简单的demo
多用户排列,反之,把用户加入队列,后台程序去跑调用用户,当数量达到一定或固定数量,就关闭redis或者清理状态,用户排队界面直接抛出 已抢完 等提示
最新发布
- 守护进程-kill端口-输出日志-查看等!
- git 本地分支关联远程分支,合并!
- pytorch安装(含cuda、cudnn安装教程)!
- linux系统下ubuntu22.04安装Docker方法!
- 视频截取封面 =php-ffmpeg/php-ffmpeg!
- 常用实例2023-5-10!
- 富文本 塞入mysql 报错: General error: 1366 Incorrect string value: ‘\xF0\x9F\x98\x84‘ for column ‘content‘!
- 百度地图拖拽获取地址实例!
- php使用smtp鉴权方式发送邮件 插件PHPMailer!
- 有道翻译接口对接!