zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    sendmessage参数
    combobox添加选项
    sql数据库时间转换convert
    Javascript知识四(DOM)
    Javascript知识三
    JavaScript知识(二)
    JavaScript知识(一)
    三层架构
    ADO知识的运用二(Day 28)
    SQL知识三(Day 27)
  • 原文地址:https://www.cnblogs.com/dawuge/p/14186824.html
Copyright © 2011-2022 走看看