php redis 队列抢红包_php+redis消息队列实现抢购步骤详解(附代码)

本文详细讲解了如何使用PHP和Redis消息队列实现抢购功能,防止高并发下的超卖问题。通过Redis队列和MySQL事务与排它锁,确保库存的准确管理。文中提供代码示例,包括基于Redis队列和MySQL事务的两种方法。
摘要由CSDN通过智能技术生成

这次给大家带来php+redis消息队列实现抢购步骤详解(附代码),php+redis消息队列实现抢购的注意事项有哪些,下面就是实战案例,一起来看一下。

实现功能:

1. 基于redis队列,防止高并发的超卖

2. 基于mysql的事务加排它锁,防止高并发的超卖

基于redis队列工作流程:

1. 管理员根据goods表中的库存,创建redis商品库存队列

2. 客户端访问秒杀API

3. web服务器先从redis的商品库存队列中查询剩余库存重点内容

4. redis队列中有剩余,则在mysql中创建订单,去库存,抢购成功

5. redis队列中没有剩余,则提示库存不足,抢购失败重点内容

基于mysql事务和排它锁工作流程:

1. 开启事务

2. 查询库存,并显示的设置写锁(排他锁):SELECT * FROM goods WHERE id = 1 FOR UPDATE

3. 生成订单

4. 去库存,隐示的设置写锁(排他锁):UPDATE goods SET counts = counts – 1 WHERE id = 1

5. commit,释放锁

注意:第二步步可以设置共享锁,不然有可能会造成死锁。

代码:<?php

/**********************************************

* 抢购模块

*

* @author liubin

* @date 2016-02-10

*

* ab -n 1000 -c 100 http://192.168.16.73/Seckill/buy.php

*

*/

class seckill extends common

{

private $_orderModel = null;

private $_goodsModel = null;

private $_redis = null;

/*

* 错误信息

*/

protected $_error = '';

/**

* 构造器

*

*/

public function construct()

{

if($this->_orderModel === null){

$this->_orderModel = new OrderModel();

}

if($this->_goodsModel === null){

$this->_goodsModel = new GoodsModel();

}

if($this->_redis === null){

$this->_redis = new QRedis();

}

}

/*

* 秒杀API

*

* @author liubin

* @date 2017-02-10

*/

public function addQsec(){

$gid = intval($_G

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值