PHP+Redis秒杀其实很简单

前言:

秒杀这个问题,一直以来都是经典的面试题。但是秒杀也分大小。如果一个产品的用户不超过5w,上来就问双十一级别的秒杀。那就没有意思了~,所以今天就简单聊下一般条件下的秒杀的思路。方法只有两个,一个是装载秒杀商品。一个就是模拟用户进场秒杀。


图片发自简书App

工具介绍

首先环境就比较简单

  1. Apache
  2. PHP 7.3
  3. redis

框架我选择的ThinkPHP5.1 不过这次我主要还是选择贴近原生的写法

选择apache的原因很简单。自带压力测试工具ab。符合我们的需要。虽然我们知道nginx来做web服务器性能更好。
php7.* 这个不用多介绍了PHP 7 和 PHP 5的性能不是一个世界的
redis 虽然可以实现秒杀的方式有很多。redis算是非常常见的缓存和中间件工具了。在性能和上手难度上都是很不错的选择

一.装载秒杀商品

我们先假设我们有300个人来抢30件商品。那么我们就在我们的商品库里面装载30件不同id的商品
秒杀商品一般都是定时添加的。所以我们需要一个定时任务控制器用cli模式执行

class Crontab
{
      public function addGoods()
    {
        //设定商品数量
        $count=30;
        $listKey="2019_04_15_goods_list";
        //创建连接redis对象
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        for ($i=1;$i<=$count;$i++){
            //将商品id push到列表中
            $redis->rPush($listKey,$i);
        }
    }
}

然后当我们需要装载商品的时候我们使用php命令去执行下我们的方法

php /项目地址/public/index.php index/crontab/addgoods

用redis客户端查看下商品id是否放入成功


查看商品id

二.秒杀商品

秒杀商品其实就是一个将集合中的商品id取出和用户id绑定的过程。只是这个过程进行的非常的快。那么我们将秒杀分为两步,如果秒杀成功,则记录下用户id和商品id 也就是所谓的秒杀订单。如果秒杀失败,我们则简单的记录一个秒杀失败的人数。来确定这次秒杀有多少有效用户参与。

  public function kill()
    {
        //假装是用户的唯一标识
        $uuid=md5(uniqid('user').time());
        //创建连接redis对象
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        $listKey="2019_04_15_goods_list";
        $orderKey="2019_04_15_buy_order";
        $failUserNum="2019_04_15_fail_user_num";
        if ($goodsId=$redis->lPop($listKey)) {
            //秒杀成功
            //将幸运用户存在集合中
            $redis->hSet($orderKey,$goodsId,$uuid);
        }else{
            //秒杀失败
            //将失败用户计数
            $redis->incr($failUserNum);
        }
        echo "SUCCESS";
    }

压力测试模拟秒杀

刚刚有提到会使用apache自带的ab做测试
小试牛刀 300并发 3000访问量

ab -c 300 -n 3000 http://shop.example.com/index.php/index/index/kill

啥也不说就是干

运行结果

虽说还是比较慢,但是3000次请求,是全部命中没有死掉的用户。加上我本身docker性能没给到最大。加上只有单机节点。我对这个成绩还是比较满意的

下面来看看抢到商品的幸运用户

[root@2f7621a62356 bin]# redis-cli  
127.0.0.1:6379> HGETALL 2019_04_15_buy_order
商品和 用户id的对应关系

再看看秒杀失败的用户数量


抢购失败次数

这时候的商品list已经空空如也了。

好了,今天简单做个秒杀,就介绍到这里。有时候思路比实现的方法更重要。今天我所介绍的主要是一个思路和redis的用法,现实中的秒杀肯定还有很多复杂的逻辑。我也是简单介绍下。如果有什么不对的地方欢迎大神指点。感谢

以上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容