好久没来整理文章了,闲了没事写篇文章记录下PHP+redis实现商城秒杀功能。
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
2、项目中实际使用redis
2.1.第一步配置redis参数如下,redis安装的默认端口为6379:
2.3. 秒杀的核心问题是在大并发的情况下不会超出库存的购买,这个就是处理的关键所以思路是第一步在秒杀类的先做一些基础的数据生成:
2.4. 第二步就是关键所在,用户在进入商品详情页前先将当前商品的库存进行队列存入redis如下:
}
接下来要做的就是用ajax来异步的处理用户点击购买按钮进行符合条件的数据进入购买的排队队列(如果当前用户没在当前产品用户的队列就进入排队并且pop一个库存队列,如果在就抛出,):
if($goods_number_key){
// 判断<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>是否已在队列
if (!$re<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>->hGet("{$this->user_queue_key}",$this->user_id)) {
// 插入抢购<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>信息
$userinfo = array(
"user_id" => $this->user_id,"create_time" => time()
);
$re<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>->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" => "系统繁忙,请重试!"));
}
}
if($Rd == 0){
exit("Re<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>队列已释放!");
}
}
走到此处的时候秒杀的核心基本就完了,细节还需要自己在去完善,像购物车这边的处理还有订单的处理,好吧开始跑程序利用apache自身的ab可以进行简单的模拟并发测试如下:
跑起来,我擦跑步起来redis没有任何反应,此时还少一步重要的步骤就是开启redis服务,请根据自己的系统下一个redisbin_x32或者redisbin_x64的redis服务管理工具,点击redis-server.exe,ok至此全部完成如下图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。