PHP+Redis实现秒杀
思路:
1. 初始化:先将10件商品push到商品列表(seckill_goods:1)。
2. 抢购:利用pop操作的原子性,每成功抢购1件商品就从该列表pop一个数,并将该用户push到订单列表(seckill_order:1)。当商品redis列表pop空了,返回false。
代码:
class Seckill { protected $redis; public function __construct() { $this->redis = new \Redis(); $this->redis->connect('127.0.0.1',6379); } /** * 初始化 * @return int */ public function init() { $num = 10; $gid = 1; // 商品编号 for($i = 0; $i < $num; $i++) { $this->redis->rpush('seckill_goods:'.$gid, 1); // 将商品push到商品列表, 值无意义 } $len = $this->redis->llen('seckill_goods:'.$gid); return $len; } /** * 抢购 * @return string */ public function buy() { $uid = 1; // 用户编号 $gid = 1; // 商品编号 //$result = $this->redis->sIsMember('seckill_user:'.$gid, $uid); // 用户已参与过活动 //if ($result) { // return '您已参与过该活动'; //} $len = $this->redis->lpop('seckill_goods:'.$gid); // 列表为空则抢完了 if(!$len) { return '已抢完'; } $this->redis->rpush('seckill_order:'.$gid, $uid); //$this->redis->sAdd('seckill_user:'.$gid, $uid); // 将该用户加入集合 return '恭喜,抢购成功'; } }
然后就是同步数据的问题了
可以根据商品的量级决定用mq或者定时任务来同步数据到mysql