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

資訊專欄INFORMATION COLUMN

Laravel延遲隊列實現(xiàn)之Lua腳本解析

meteor199 / 1419人閱讀

摘要:在實現(xiàn)延遲隊列時使用了腳本保證不同隊列間操作的原子性在中主要是通過個腳本方法保證不同隊列操作的原子性的一統(tǒng)計隊列任務數(shù)量方法統(tǒng)計隊列數(shù)量統(tǒng)計隊列數(shù)據(jù)量二隊列任務放入保留隊列三將任務由添加隊列到隊列中四將隊

Laravel在實現(xiàn)Redis延遲隊列時使用了Lua腳本保證不同隊列間操作的原子性
在Laravel5.1中主要是通過4個Lua腳本方法保證不同隊列操作的原子性的

一、統(tǒng)計隊列任務數(shù)量方法

1.llen 統(tǒng)計list隊列數(shù)量

2.zcard統(tǒng)計zset隊列數(shù)據(jù)量

    /**
     * Get the Lua script for computing the size of queue.
     *
     * KEYS[1] - The name of the primary queue
     * KEYS[2] - The name of the "delayed" queue
     * KEYS[3] - The name of the "reserved" queue
     *
     * @return string
     */
    public static function size()
    {
        return <<<"LUA"
             return redis.call("llen", KEYS[1]) + redis.call("zcard", KEYS[2]) + 
             redis.call("zcard", KEYS[3])
        LUA;
    }

二、pop隊列任務放入reserved(保留)隊列

    /**
     * Get the Lua script for popping the next job off of the queue.
     *
     * KEYS[1] - The queue to pop jobs from, for example: queues:foo
     * KEYS[2] - The queue to place reserved jobs on, for example: queues:foo:reserved
     * ARGV[1] - The time at which the reserved job will expire
     *
     * @return string
     */
    public static function pop()
    {
      return <<<"LUA"
          -- Pop the first job off of the queue...
         local job = redis.call("lpop", KEYS[1])
         local reserved = false

         if(job ~= false) then
            -- Increment the attempt count and place job on the reserved queue...
            reserved = cjson.decode(job)
            reserved["attempts"] = reserved["attempts"] + 1
            reserved = cjson.encode(reserved)
            redis.call("zadd", KEYS[2], ARGV[1], reserved)
         end
        return {job, reserved}
      LUA;
    }

三、將任務由添加reserved隊列到delayed隊列中

    /**
     * Get the Lua script for releasing reserved jobs.
     *
     * KEYS[1] - The "delayed" queue we release jobs onto, for example: queues:foo:delayed
     * KEYS[2] - The queue the jobs are currently on, for example: queues:foo:reserved
     * ARGV[1] - The raw payload of the job to add to the "delayed" queue
     * ARGV[2] - The UNIX timestamp at which the job should become available
     *
     * @return string
     */
    public static function release()
    {
        return <<<"LUA"
           -- Remove the job from the current queue...
           redis.call("zrem", KEYS[2], ARGV[1])
           -- Add the job onto the "delayed" queue...
           redis.call("zadd", KEYS[1], ARGV[2], ARGV[1])
           return true
        LUA;
    }

四、將reserved隊列滿足時間的任務合并到執(zhí)行隊列中

    /**
     * Get the Lua script to migrate expired jobs back onto the queue.
     *
     * KEYS[1] - The queue we are removing jobs from, for example: queues:foo:reserved
     * KEYS[2] - The queue we are moving jobs to, for example: queues:foo
     * ARGV[1] - The current UNIX timestamp
     *
     * @return string
     */
    public static function migrateExpiredJobs()
    {
        return <<<"LUA"
        -- Get all of the jobs with an expired "score"...
           local val = redis.call("zrangebyscore", KEYS[1], "-inf", ARGV[1])

        -- If we have values in the array, we will remove them from the first queue
        -- and add them onto the destination queue in chunks of 100, which moves
        -- all of the appropriate jobs onto the destination queue very safely.
           if(next(val) ~= nil) then
             redis.call("zremrangebyrank", KEYS[1], 0, #val - 1)

             for i = 1, #val, 100 do
               redis.call("rpush", KEYS[2], unpack(val, i, math.min(i+99, #val)))
             end
           end
          return val
        LUA;
    }

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

轉載請注明本文地址:http://systransis.cn/yun/28594.html

相關文章

  • Laravel 基于redis隊列解析

    摘要:年月日參考鏈接使用不得不明白的知識隊列文檔中文文檔本文環(huán)境隊列為什么使用隊列使用隊列的目的一般是異步執(zhí)行出錯重試解釋一下異步執(zhí)行部分代碼執(zhí)行很耗時為了提高響應速度及避免占用過多連接資源可以將這部分代碼放到隊列中異步執(zhí)行網站新用戶注冊后需要 Last-Modified: 2019年5月10日15:04:22 參考鏈接 使用 Laravel Queue 不得不明白的知識 Laravel ...

    banana_pi 評論0 收藏0
  • 個人整理, 閱讀過的好文章 (每天隨時更新)

    摘要:大家有好的文章可以在評論下面分享出來共同進步本文鏈接數(shù)組使用之道程序員進階學習書籍參考指南教你在不使用框架的情況下也能寫出現(xiàn)代化代碼巧用數(shù)組函數(shù)框架中間件實現(xiàn)沒錯,這就是面向對象編程設計模式需要遵循的個基本原則令人困惑的在中使用協(xié)程實現(xiàn)多任 大家有好的文章,可以在評論下面分享出來, 共同進步! 本文github鏈接 php PHP 數(shù)組使用之道 PHP程序員進階學習書籍參考指南 教你...

    Chiclaim 評論0 收藏0
  • 為什么 Laravel 會重復執(zhí)行同一個隊列任務?

    摘要:把因執(zhí)行超時的隊列從集合重新到當前執(zhí)行的隊列中。從要執(zhí)行的隊列中取任務可以看到在取要執(zhí)行的隊列的時候,同時會放一份到一個有序集合中,并使用過期時間戳作為分值。 (原文鏈接:https://blog.tanteng.me/2017/...) 在 Laravel 中使用 Redis 處理隊列任務,框架提供的功能非常強大,但是最近遇到一個問題,就是發(fā)現(xiàn)一個任務被多次執(zhí)行,這是為什么呢? 先說...

    vboy1010 評論0 收藏0
  • 「真?全棧路」Web前端開發(fā)的后端指南

    前言 在若干次前的一場面試,面試官看我做過python爬蟲/后端 的工作,順帶問了我些后端相關的問題:你覺得什么是后端? 送命題。當時腦瓦特了,答曰:邏輯處理和數(shù)據(jù)增刪改查。。。 showImg(https://user-gold-cdn.xitu.io/2019/4/24/16a4ed4fc8c18078); 當場被懟得體無完膚,羞愧難當。事后再反思這問題,結合資料總結了一下。發(fā)現(xiàn)自己學過的Re...

    chuyao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<