侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解thinkphp+redis+队列的实现代码

ThinkPHP  /  管理员 发布于 7年前   461

1,安装Redis,根据自己的PHP版本安装对应的redis扩展(此步骤简单的描述一下)

1.1,安装 php_igbinary.dll,php_redis.dll扩展此处需要注意你的php版本如图:

  

1.2,php.ini文件新增 extension=php_igbinary.dll;extension=php_redis.dll两处扩展

ok此处已经完成第一步redis环境搭建完成看看phpinfo

项目中实际使用redis

2.1,第一步配置redis参数如下,redis安装的默认端口为6379: 

 'Redis_',//缓存前缀 'DATA_CACHE_TYPE'=>'Redis',//默认动态缓存为Redis 'DATA_CACHE_TIMEOUT' => false, 'REDIS_RW_SEPARATE' => true, //Redis读写分离 true 开启 'REDIS_HOST'=>'127.0.0.1', //redis服务器ip,多台用逗号隔开;读写分离开启时,第一台负责写,其它[随机]负责读; 'REDIS_PORT'=>'6379',//端口号 'REDIS_TIMEOUT'=>'300',//超时时间 'REDIS_PERSISTENT'=>false,//是否长连接 false=短连接 'REDIS_AUTH'=>'',//AUTH认证密码 );?>

2.2,实际函数中使用redis:

/**  * redis连接  * @access private  * @return resource  * @author bieanju  */ private function connectRedis(){  $redis=new \Redis();  $redis->connect(C("REDIS_HOST"),C("REDIS_PORT"));    return $redis; }

2.3,秒杀的核心问题是在大并发的情况下不会超出库存的购买,这个就是处理的关键所以思路是第一步在秒杀类的先做一些基础的数据生成:

//现在初始化里面定义后边要使用的redis参数public function _initialize(){  parent::_initialize();  $goods_id = I("goods_id",'0','intval');    if($goods_id){   $this->goods_id = $goods_id;   $this->user_queue_key = "goods_".$goods_id."_user";//当前商品队列的用户情况   $this->goods_number_key = "goods".$goods_id;//当前商品的库存队列  }  $this->user_id = $this->user_id ? $this->user_id : $_SESSION['uid'];   }

2.4,第二步就是关键所在,用户在进入商品详情页前先将当前商品的库存进行队列存入redis如下:

 /** * 访问产品前先将当前产品库存队列 * @access public * @author bieanju */ public function _before_detail(){  $where['goods_id'] = $this->goods_id;  $where['start_time'] = array("lt",time());  $where['end_time'] = array("gt",time());  $goods = M("goods")->where($where)->field('goods_num,start_time,end_time')->find();  !$goods && $this->error("当前秒杀已结束!");  if($goods['goods_num'] > $goods['order_num']){   $redis = $this->connectRedis();   $getUserRedis = $redis->hGetAll("{$this->user_queue_key}");   $gnRedis = $redis->llen("{$this->goods_number_key}");   /* 如果没有会员进来队列库存 */   if(!count($getUserRedis) && !$gnRedis){       for ($i = 0; $i < $goods['goods_num']; $i ++) {     $redis->lpush("{$this->goods_number_key}", 1);    }   }   $resetRedis = $redis->llen("{$this->goods_number_key}");   if(!$resetRedis){    $this->error("系统繁忙,请稍后抢购!");   }  }else{   $this->error("当前产品已经秒杀完!");  }    }

接下来要做的就是用ajax来异步的处理用户点击购买按钮进行符合条件的数据进入购买的排队队列(如果当前用户没在当前产品用户的队列就进入排队并且pop一个库存队列,如果在就抛出,):

/**  * 抢购商品前处理当前会员是否进入队列  * @access public  * @author bieanju  */ public function goods_number_queue(){  !$this->user_id && $this->ajaxReturn(array("status" => "-1","msg" => "请先登录"));  $model = M("flash_sale");  $where['goods_id'] = $this->goods_id;  $goods_info = $model->where($where)->find();  !$goods_info && $this->error("对不起当前商品不存在或已下架!");   /* redis 队列 */   $redis = $this->connectRedis();  /* 进入队列 */  $goods_number_key = $redis->llen("{$this->goods_number_key}");  if (!$redis->hGet("{$this->user_queue_key}", $this->user_id)) {   $goods_number_key = $redis->lpop("{$this->goods_number_key}");  }     if($goods_number_key){   // 判断用户是否已在队列   if (!$redis->hGet("{$this->user_queue_key}", $this->user_id)) {    // 插入抢购用户信息    $userinfo = array(     "user_id" => $this->user_id,     "create_time" => time()    );        $redis->hSet("{$this->user_queue_key}", $this->user_id, serialize($userinfo));    $this->ajaxReturn(array("status" => "1"));   }else{    $modelCart = M("cart");    $condition['user_id'] = $this->user_id;    $condition['goods_id'] = $this->goods_id;    $condition['prom_type'] = 1;  $cartlist = $modelCart->where($condition)->count();    if($cartlist > 0){     $this->ajaxReturn(array("status" => "2"));    }else{          $this->ajaxReturn(array("status" => "1"));         }        }      }else{   $this->ajaxReturn(array("status" => "-1","msg" => "系统繁忙,请重试!"));  } }

附加一个调试的函数,删除指定队列值:

 public function clearRedis(){   set_time_limit(0);   $redis = $this->connectRedis();   //$Rd = $redis->del("{$this->user_queue_key}");   $Rd = $redis->hDel("goods49",'用户id'');   $a = $redis->hGet("goods_49_user", '用户id');   if(!$a){    dump($a);   }      if($Rd == 0){    exit("Redis队列已释放!");      }  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:

  • ThinkPHP3.2框架操作Redis的方法分析
  • ThinkPHP自定义Redis处理SESSION的实现方法
  • thinkPHP框架通过Redis实现增删改查操作的方法详解
  • thinkphp5框架扩展redis类方法示例
  • ThinkPHP实现多数据库连接的解决方法
  • thinkPHP5实现的查询数据库并返回json数据实例
  • ThinkPHP 连接Oracle数据库的详细教程[全]
  • ThinkPHP连接数据库及主从数据库的设置教程
  • tp5(thinkPHP5)操作mongoDB数据库的方法
  • thinkphp配置连接数据库技巧
  • ThinkPHP连接数据库的方式汇总
  • Thinkphp 3.2框架使用Redis的方法详解


  • 上一条:
    thinkPHP3.0框架实现模板保存到数据库的方法
    下一条:
    ThinkPHP 3.2.3实现页面静态化功能的方法详解
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客