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

  • 相关阅读:
    css3简易实现图标动画由小到大逐个显现
    下拉图标呼吸效果制作
    设置图片从页面四周渐入效果的锚点方法
    关于导航宽度高度自适应的小栗子
    Odd-e CSD Course Day 5
    Odd-e CSD Course Day 2
    Odd-e CSD Course Day 3
    Odd-e CSD Course Day 1
    Odd-e CSD Course Day 4
    [心得] SQL Server Partition(表分區) 資料分佈探討
  • 原文地址:https://www.cnblogs.com/dawuge/p/14186824.html
Copyright © 2011-2022 走看看