1.1.安装php_igbinary.dll,php_redis.dll扩展此处须要把稳你的php版本如图:

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

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

商城系统库存php问题phpredis实现商城秒杀功效详解 AJAX

2、项目中实际利用redis

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

<?php

/ 数据库配置 /

return array(

'DATA_CACHE_PREFIX' => '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行列步队已开释!
\公众);

}

}

走到此处的时候秒杀的核心基本就完了,细节还须要自己在去完善,像购物车这边的处理还有订单的处理,好吧开始跑程序利用apache自身的ab可以进行大略的仿照并发测试如下:

跑起来,我擦跑步起来redis没有任何反应,此时还少一步主要的步骤便是开启redis做事,请根据自己的系统下一个redisbin_x32或者redisbin_x64的redis做事管理工具,点击redis-server.exe,ok至此全部完成如下图: