个人理解
前台:
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 "抢购成功";
}