序言:php+redis实现秒杀功能,可缓解瞬时并发对mysql的压力,也是面试过程以及工作中常用到的知识点,如果对你有帮助的话赶紧点赞收藏吧。
场景:在某个时间点对商品goods_id=2的商品进行抢购,商品库存为10
建立商品goods_id=2的库存抢购列表
首先创建待抢购商品的list列表,如果有人抢购成功就移除一个,直到列表为空则表示抢购完成。
//1、连接redis数据库
$redis=newRedis();
$redis-connect(.0.0.1,);
$redis_name=goods_id_2;//比如商品id=2的商品参与秒杀
//2、模拟抢购,库存为10,将库存放到redis中
$num=10;
for($i=0;$i$num;$i++){
$redis-lPush($redis_name,1);//这里用某个商品的ID作为标识
}
echo"执行成功";
客户端进行模拟抢购
//1、连接redis数据库
$redis=newRedis();
$redis-connect(.0.0.1,);
$redis_name=goods_id_2;//比如商品id=2的商品参与秒杀
//3、模拟用户请求,随机获取10名用户表示抢购成功
for($i=0;$i;$i++){
$user_id=rand(,);
$len=$redis-lLen($redis_name);
$str="";
if(!$len
$len=0){
$str.=$user_id."抢购已结束";
break;
}else{
$redis_user_name="goods_id_2_user_id";
//判断抢购列表中是否已存在该用户,获取列表中所有的数据
$skill_list=$redis-lrange($redis_user_name,0,-1);
if(in_array($user_id,$skill_list)){
$str.=$user_id."请勿重复提交";
}else{
$redis-rPop($redis_name);
$redis-lPush($redis_user_name,$user_id."_".ceil(microtime(true)*0));
$str.=$user_id."已抢到";
}
}
file_put_contents("D:/