详细解释thinkphp redis队列的实现代码
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
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队列已释放!');} }以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:详细解释thinkphp redis队列的实现代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。