<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # ngx.shared.DICT 非隊列性質 執行階段和主要函數請參考[維基百科 HttpLuaModule#ngx.shared.DICT](http://wiki.nginx.org/HttpLuaModule#ngx.shared.DICT) ### 非隊列性質 ngx.shared.DICT的實現是采用紅黑樹實現,當申請的緩存被占用完后如果有新數據需要存儲則采用LRU算法淘汰掉“多余”數據。 這樣數據結構的在帶有隊列性質的業務邏輯下會出現的一些問題: 我們用shared作為緩存,接納終端輸入并存儲,然后在另外一個線程中按照固定的速度去處理這些輸入,代碼如下: ~~~ -- [ngx.thread.spawn](http://wiki.nginx.org/HttpLuaModule#ngx.thread.spawn) #1 存儲線程 理解為生產者 .... local cache_str = string.format([[%s&%s&%s&%s&%s&%s&%s]], net, name, ip, mac, ngx.var.remote_addr, method, md5) local ok, err = ngx_nf_data:safe_set(mac, cache_str, 60*60) --這些是緩存數據 if not ok then ngx.log(ngx.ERR, "stored nf report data error: "..err) end .... -- [ngx.thread.spawn](http://wiki.nginx.org/HttpLuaModule#ngx.thread.spawn) #2 取線程 理解為消費者 while not ngx.worker.exiting() do local keys = ngx_share:get_keys(50) -- 一秒處理50個數據 for index, key in pairs(keys) do str = ((nil ~= str) and str..[[#]]..ngx_share:get(key)) or ngx_share:get(key) ngx_share:delete(key) --干掉這個key end .... --一些消費過程,看官不要在意 ngx.sleep(1) end ~~~ 在上述業務邏輯下會出現由生產者生產的某些key-val對永遠不會被消費者取出并消費,原因就是shared.DICT不是隊列,ngx_shared:get_keys(n)函數不能保證返回的n個鍵值對是滿足FIFO規則的,從而導致問題發生。 ### 問題解決 問題的原因已經找到,解決方案有如下幾種:1.修改暫存機制,采用redis的隊列來做暫存;2.調整消費者的消費速度,使其遠遠大于生產者的速度;3.修改ngx_shared:get_keys()的使用方法,即是不帶參數; 方法3和2本質上都是一樣的,由于業務已經上線,方法1周期太長,于是采用方法2解決,在后續的業務中不再使用shared.DICT來暫存隊列性質的數據
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看