首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

OpenResty ngx.shared.Dict 一鍵清空:flush_all 行為詳解

     編輯:程式設計綜合問答

ngx.shared.DICT:flush_all() 能否立即釋放內存?答案是:清空鍵值,但內存不立即歸還操作系統。

行為細節

  • flush_all():標記所有槽位為空,get_keys() 返回空表,get() 返回 nil。操作 O(1),極快。
  • 內存釋放時機:
    • Worker 進程退出(Nginx reload/quit)。
    • 共享內存區塊被 lua_shared_dict 指令重新定義大小(需 reload)。
  • 不會觸發:flush_all() 後內存佔用不變,再次 set() 會復用原有槽位。

實戰建議

  1. 定期清理過期鍵:用 expire 參數配合 set(key, val, ttl),自動過期不佔槽位。
  2. 監控內存:ngx.shared.DICT:capacity() / free_space() 觀察碎片率。
  3. 大量寫入場景:預分配足夠大小 lua_shared_dict mydict 100m; 避免擴容鎖競爭。

代碼示例

local dict = ngx.shared.mydict
dict:set("k1", "v1", 60)  -- 60秒過期
dict:flush_all()          -- 立即清空所有鍵
local keys = dict:get_keys(0) -- 返回 {}
-- 內存仍佔用,但槽位可復用
「內存不會馬上釋放。但是 shared 內存 nginx 重啟之後就會釋放了。」—— 理解共享內存生命周期,避免誤判洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved