Redis+PHP实现秒杀

5 篇文章 0 订阅

个人理解

前台:

1、点击后按钮置灰,不可再次点击;

2、js层面,10秒内不允许再次提交请求;系统繁忙,请稍后再试!

后台:

1、判断请求的userid,同一个userid,10秒内只能请求一次;系统繁忙,请稍后再试!

2、请求队列,redis队列,如果队列为空,则返回“已售完”

3、只可以支付固定的次数,如果次数减为0了,返回“已售完”

后台商品设置是否是秒杀商品、秒杀开始时间、结束时间,如何生效?

答:当用户点击商品详情的时候,判断商品的这些信息,如果是并且处于时间段内,去增加商品队列,判断是否已有队列,如果没有,将该商品的库存增加到该商品的队列中,并设置过期时间;如果有,则无需操作,可直接调取该商品队列使用;

后台修改库存和到期时间,这时redis需要修改吗?

答:查询这个商品是否存在该商品队列,不存在不用管;如果存在,则删除已有,用户点击详情时,重新添加。

下单减库存,用户已成功抢购,队列中数据已减去,但这个用户迟迟没有付款怎么办?

答:未付款订单设置一个过期时间,下单后15分钟未支付的,将订单取消,同时将这个订单的商品库存重新写入队列中。数据库中库存在支付成功后才减少;


秒杀方法1

第一步:先将商品库存存入队列

<?php
//链接redis
$redis =new Redis();
$result = $redis->connect("127.0.0.1",6379);
//$redis->auth('my pass'); //密码验证
//设置100件商品库存
$goods_number =100;
//将100件商品存入到Redis链表中
for($i=0;$i<$goods_number;$i++){
//lpush从链表的头部添加元素
    $redis->lpush('goods_store',1);
}
//llen返回列表key的长度
echo$redis->llen('goods_store');

第二步:抢购开始,设置库存的缓存周期

<?php
//设定一个key的活动时间
$redis->setTimeout('goods_store',60);

第三步:客户端执行下单操作,下单前判断redis队列库存量

<?php
//第三步,客户端执行下单操作,下单前判断redis队列库存量
$redis =newRedis();
$redis->connect("127.0.0.1",6379);
//从链表的头部删除一个元素,返回删除的元素,$count为true
$count = $redis->lpop('goods_store');
if(!$count) {
    echo "抢购失败";
    return;
}else{
	echo "抢购成功";
}

秒杀方法2(整合成类,可直接调用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值