手机版

php redis实现商城尖峰功能

时间:2021-09-01 来源:互联网 编辑:宝哥软件园 浏览:

好久没来整理文章了,没时间写文章记录php redis对商城spike功能的实现。

1.安装redis,并根据您的php版本安装相应的redis扩展(这一步简单介绍)

1.1.安装php_igbinary.dll并扩展php_redis.dll在这里你需要注意你的php版本如图所示:

1.2.向PHP.ini文件添加扩展名=php _ igbinary.dll扩展名=php_redis.dll有两个扩展名

好了,第一步已经完成了。redis环境已经建立。看看phpinfo

2.redis实际上在项目中使用

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

?Php/*数据库配置*/returnry(' DATA _ CACHE _ prefix '=' Redis _ ',//cache前缀' DATA_CACHE_TYPE'='Redis ',//默认动态缓存为Redis ' DATA _ CACHE _ time out '=false,Redis _ RW _ separate '=true//Redis读写分离为真;'redis _ Host '=' 127 . 0 . 0 . 1 ';//Redis服务器IP;多个集合用逗号分隔;读写分离开启时,第一个负责写,其他【随机】负责读;REDIS_PORT'='6379 ',//端口号' REDIS_TIMEOUT'='300 ',//time out ' REDIS _ PERSISTENT '=false,//长连接false=短连接' REDIS_AUTH'=' ',//AUTH身份验证密码);2.2.在实际函数中使用redis:

/** * redis连接* @ access private * @ return resource * @ author bian ju */private函数connect redis(){ $ redis=new \ redis();$redis-connect(C('REDIS_HOST '),C(' REDIS _ PORT ');返回$ redis}2.3.spike的核心问题是在大并发的情况下不会超过购买库存。这是处理的关键,所以想法是先在spike类中做一些基本的数据生成:

//现在初始化redis参数public function _ initialize(){ parent :3360 _ initialize();$goods_id=I('goods_id ',' 0 ',' int val ');if($ goods _ id){ $ this-goods _ id=$ goods _ id;$this-user_queue_key='goods_ '。$goods_id。_用户';//当前商品队列的用户状态$ this-goods _ number _ key=' goods '。$ goods _ id//当前商品的库存队列} $this-user_id=$this-user_id?$ this-user _ id : $ _ SESSION[' uid '];}2.4.第二步是关键。在进入产品详细信息页面之前,用户将当前产品的库存排队,并将其存储在redis中,如下所示:

/* * *访问产品前,将当前产品库存排队* @ access public * @ author bian ju */public function _ Before _ detail(){ $其中[' goods _ id ']=$ this-goods _ id;$其中['start_time']=array('lt ',time());$其中['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();$ getuser redis=$ redis-hGetAll(' { $ this-user _ queue _ key } ');$ gnRedis=$ redis-llen(' { $ this-goods _ number _ key } ');/*如果没有成员进入队列库存*/如果(!count($ getuseredis)!$ 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异步处理用户点击购买按钮符合要求的数据,进入队列进行购买(如果当前用户不在当前产品用户的队列中,他会进入队列弹出一个库存队列,如果在,他会抛出去);

/** * 抢购商品前处理当前会员是否进入队列* @访问公共* @作者bian ju */公共功能商品_ number _ queue(){!$this-user_id $this-ajaxReturn(数组(“状态”=“-1”,“消息”=”请先登录'));$ model=M(' flash _ sale ');$其中[' goods _ id ']=$ this-goods _ id;$ goods _ info=$ model-where($ where)-find();$ goods _ info $这-错误('对不起当前商品不存在或已下架!');/* 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)) { //插入抢购用户信息$ user info=array(' user _ id '=$ this-user _ id,' create _ time '=time());$ redis-hSet(' { $ this-user _ queue _ key } ',$this-user_id,serialize($ user info));$this-ajaxReturn(数组(“status”=“1”);} else { $ model cart=M(' cart ');$ condition[' user _ id ']=$ this-user _ id;$ condition[' goods _ id ']=$ this-goods _ id;$ condition[' prom _ type ']=1;$ cart list=$ model cart-where($ condition)-count();if($ cart list 0){ $ this-AJaxreturn(数组(“status”=“2”);}else{ $this-ajaxReturn(数组(“status”=“1”);} } }else{ $this-ajaxReturn(数组(“状态”=“-1”,“消息”=”系统繁忙,请重试!'));} }附加一个调试的函数,删除指定队列值:

公共函数clearRedis(){ set _ time _ limit(0);$ redis=$ this-connectRedis();//$ Rd=$ redis-del(' { $ this-user _ queue _ key } ');$ Rd=$ redis-HDel(' good 49 ','用户id ' ');$a=$redis-hGet('goods_49_user ','用户id ');if(!$ a){ dump($ a);} if($Rd==0){ exit('Redis队列已释放!');} }走到此处的时候秒杀的核心基本就完了,细节还需要自己在去完善,像购物车这边的处理还有订单的处理,好吧开始跑程序利用街头流氓自身的腹肌可以进行简单的模拟并发测试如下:

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

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

版权声明:php redis实现商城尖峰功能是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。