成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Redis 實(shí)現(xiàn)秒殺

MycLambert / 1114人閱讀

摘要:秒殺接下來是關(guān)鍵的一步,使用的是的命令獲取商品,利用的是的原子性。好的方面是秒殺成功的數(shù)量是準(zhǔn)確的,沒有超賣。參考資料實(shí)現(xiàn)高并發(fā)下的搶購(gòu)秒殺功能基于云原生的秒殺系統(tǒng)設(shè)計(jì)思路秒殺架構(gòu)設(shè)計(jì)

導(dǎo)語(yǔ)

秒殺想必大家都了解,在短時(shí)間內(nèi)請(qǐng)求訪問會(huì)激增,同時(shí)要保證不會(huì)超賣和數(shù)據(jù)的準(zhǔn)確,對(duì)于技術(shù)方面還是有些考驗(yàn)的??上У氖?,一直沒有機(jī)會(huì)在項(xiàng)目中實(shí)現(xiàn)。再看了一些資料后,打算實(shí)驗(yàn)下。以下代碼僅為測(cè)試所用,環(huán)境比較簡(jiǎn)單,請(qǐng)根據(jù)實(shí)際情況進(jìn)行修改。

創(chuàng)建秒殺隊(duì)列

在開始秒殺之前,先將商品放入隊(duì)列中,如下

/**
     * 創(chuàng)建秒殺列表
     */
    public function createList()
    {
        $count = 30;
        $redisKey = "goods_list";

        for ($i = 1; $i <= $count; $i++) {

            // 測(cè)試用,防止數(shù)據(jù)錯(cuò)誤
            if (Redis::llen($redisKey) >= $count) {
                break;
            }

            Redis::rpush($redisKey, $i);
        }
    }

執(zhí)行完后,在 Redis 中看下

有 30 個(gè)商品 ID,數(shù)據(jù)正常。

秒殺

接下來是關(guān)鍵的一步,使用的是 Redis 的 lpop 命令獲取商品 ID,利用的是 Redis 的原子性。

/**
     * 秒殺
     */
    public function buy()
    {
        // 隨機(jī)用戶名,無意義,僅做標(biāo)記
        $username = Hash::make(now());

        if ($goodsId = Redis::lpop("goods_list")) {
            // 購(gòu)買成功
            Redis::hset("buy_success", $goodsId, $username);
        } else {
            // 購(gòu)買失敗
            Redis::incr("buy_fail");
        }
    }

如上,簡(jiǎn)化了代碼,購(gòu)買之后,成功與否只是做記錄。實(shí)際應(yīng)用中,當(dāng)然會(huì)更加復(fù)雜,但要注意的是,不要同步操作 Mysql。多說一句,Hash:make(now()) 即使值相同,也不會(huì)生成相同的數(shù)據(jù),參考這里。

測(cè)試

最后就是進(jìn)行測(cè)試了,使用 ab 測(cè)試,執(zhí)行 ab -c 300 -n 3000 http://localhost/buy/ ,上述命令的意思是 300 并發(fā),共請(qǐng)求 3000 次

執(zhí)行完成,速度并不快,并且還有 794 個(gè)訪問失敗。來看下數(shù)據(jù)是否正確吧。在頁(yè)面中打印 buy_success

30 個(gè)成功者。再來看下秒殺失敗的數(shù)量

不是一個(gè)準(zhǔn)確的數(shù)字,2165+30 是所有請(qǐng)求成功的數(shù)字,再加上失敗的 794 ,總數(shù)是 2989,依然不足 3000。

結(jié)語(yǔ)

上述測(cè)試有不足的地方,響應(yīng)速度慢、請(qǐng)求失敗、失敗計(jì)數(shù)不準(zhǔn)確??磥碛泻芏嘁獌?yōu)化的地方,不止是代碼層。測(cè)試的時(shí)候忘記將訪問記錄入庫(kù)關(guān)掉,應(yīng)該是有些影響。
好的方面是秒殺成功的數(shù)量是準(zhǔn)確的,沒有超賣。

更新

重新配置了環(huán)境, 測(cè)試了同樣的代碼。不同的地方是增加了每次訪問判斷是否在黑名單(實(shí)時(shí)查詢 MySQl),而訪問記錄改成了隊(duì)列寫入 MySQL。結(jié)果如下

對(duì)比來看還是有所提升的。最主要的是數(shù)據(jù)終于是正確的,訪問失敗 355,搶購(gòu)成功 30,搶購(gòu)失敗 2615(忘記截圖了),相加總數(shù)正好是請(qǐng)求總數(shù)。而且 MySQL 中記錄的訪問記錄也是 3000。


參考資料:Redis實(shí)現(xiàn)高并發(fā)下的搶購(gòu)、秒殺功能、基于云原生的秒殺系統(tǒng)設(shè)計(jì)思路、秒殺架構(gòu)設(shè)計(jì)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31233.html

相關(guān)文章

  • Redis--秒殺場(chǎng)景應(yīng)用

    摘要:在大流量程序開發(fā)中,必然會(huì)遇到高并發(fā)的應(yīng)用的場(chǎng)景。樂觀鎖實(shí)現(xiàn)秒殺功能它的優(yōu)點(diǎn)如下消息隊(duì)列對(duì)內(nèi)存消耗較大,個(gè)請(qǐng)求,需要操作出隊(duì)列。需要結(jié)合實(shí)際的業(yè)務(wù)場(chǎng)景嵌入本文的核心實(shí)現(xiàn)邏輯。 在大流量程序開發(fā)中,必然會(huì)遇到高并發(fā)的應(yīng)用的場(chǎng)景。解決方案大致分為兩個(gè)方向,消息隊(duì)列、鎖 redis 實(shí)現(xiàn)消息隊(duì)列核心簡(jiǎn)單版本 $key = quque; /** ...

    lovXin 評(píng)論0 收藏0
  • 秒殺系統(tǒng)優(yōu)化方案之緩存、隊(duì)列、鎖設(shè)計(jì)思路

    摘要:一為什么難秒殺系統(tǒng)難做的原因庫(kù)存只有一份,所有人會(huì)在集中的時(shí)間讀和寫這些數(shù)據(jù)。又例如搶票,亦與秒殺類似,瞬時(shí)流量更甚。 一、為什么難 ????秒殺系統(tǒng)難做的原因:庫(kù)存只有一份,所有人會(huì)在集中的時(shí)間讀和寫這些數(shù)據(jù)。例如小米手機(jī)每周二的秒殺,可能手機(jī)只有1萬部,但瞬時(shí)進(jìn)入的流量可能是幾百幾千萬。又例如12306搶票,亦與秒殺類似,瞬時(shí)流量更甚。 主要需要解決的問題有兩個(gè): 高并發(fā)對(duì)數(shù)據(jù)庫(kù)...

    dinfer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<