nginx的共享字典項api(操作方法)

nginx的共享內存,稱爲共享字典項,對於所有的worker進程都可見,是一種全局變量。

備註一下內容中的 [] 是 備註。

源碼分析文檔:https://www.codercto.com/a/9488.html

git 文檔 :https://github.com/openresty/lua-nginx-module#ngxshareddictget

設置全局字典項,在http 配置塊下:

lua_shared_dict cats[字典項名稱] 12M[內存大小];

 

1、 ngx.shared.DICT.get

語法:value, flags = ngx.shared.DICT:get(key)

獲取共享內存上key對應的值。如果key不存在,或者key已經過期,將會返回nil;如果出現錯誤,那麼將會返回nil以及錯誤信息。

local cats = ngx.shared.cats local value, flags = cats.get(cats, "Marry")

等價於

local cats = ngx.shared.cats local value, flags = cats:get("Marry")

返回列表中的flags,是在ngx.shared.DICT.set方法中設置的值,默認值爲0. 如果設置的flags爲0,那麼在這裏flags的值將不會被返回。

 

2、 ngx.shared.DICT.get_stale

語法:value, flags, stale = ngx.shared.DICT:get_stale(key) 與get方法類似,區別在於該方法對於過期的key也會返回,第三個返回參數表明返回的key的值是否已經過期,true表示過期,false表示沒有過期。

 

3、 ngx.shared.DICT.set

語法:success, err, forcible = ngx.shared.DICT:set(key, value, exptime?, flags?)

無條件”地往共享內存上插入key-value對,這裏講的“無條件”指的是不管待插入的共享內存上是否已經存在相同的key。三個返回值的含義:

success:成功插入爲true,插入失敗爲false

err:操作失敗時的錯誤信息,可能類似"no memory"

forcible:true表明需要通過強制刪除(LRU算法)共享內存上其他字典項來實現插入,false表明沒有刪除共享內存上的字典項來實現插入。

第三個參數exptime表明key的有效期時間,單位是秒(s),默認值爲0,表明永遠不會過期;flags參數是一個用戶標誌值,會在調用get方法時同時獲取得到。

local cats = ngx.shared.cats
local succ, err, forcible = cats.set(cats, "Marry", "it is a nice cat!")
 
等價於
 
local cats = ngx.shared.cats
local succ, err, forcible = cats:set("Marry", "it is a nice cat!")

4、 ngx.shared.DICT.safe_set

語法:ok, err = ngx.shared.DICT:safe_set(key, value, exptime?, flags?)

與set方法類似,區別在於不會在共享內存用完的情況下,通過強制刪除(LRU算法)的方法實現插入。如果內存不足,會直接返回nil和err信息"no memory"

注意:

set和safe_set共同點是:如果待插入的key已經存在,那麼key對應的原來的值會被新的value覆蓋!

5、  ngx.shared.DICT.add

語法:success, err, forcible = ngx.shared.DICT:add(key, value, exptime?, flags?)

與set方法類似,與set方法區別在於不會插入重複的鍵(可以簡單認爲add方法是set方法的一個子方法),如果待插入的key已經存在,將會返回nil和和err="exists"

6、  ngx.shared.DICT.safe_add

語法:ok, err = ngx.shared.DICT:safe_add(key, value, exptime?, flags?)

與safe_set方法類似,區別在於不會插入重複的鍵(可以簡單認爲safe_add方法是safe_set方法的一個子方法),如果待插入的key已經存在,將會返回nil和和err="exists"

7、 ngx.shared.DICT.replace

語法:success, err, forcible = ngx.shared.DICT:replace(key, value, exptime?, flags?)

與set方法類似,區別在於只對已經存在的key進行操作(可以簡單認爲replace方法是set方法的一個子方法),如果待插入的key在字典上不存在,將會返回nil和錯誤信息"not found"

8、 ngx.shared.DICT.delete

  語法:ngx.shared.DICT:delete(key)

  無條件刪除指定的key-value對,其等價於

  ngx.shared.DICT:set(key, nil)

 

9、  ngx.shared.DICT.incr

  語法:newval, err = ngx.shared.DICT:incr(key, value)

  對key對應的值進行增量操作,增量值是value,其中value的值可以是一個正數,0,也可以是一個負數。value必須是一個Lua類型中的number類型,否則將會返回nil  和"not a number";key必須是一個已經存在於共享內存中的key,否則將會返回nil和"not found".

 
10、  ngx.shared.DICT.flush_all

  語法:ngx.shared.DICT:flush_all()

  清除字典上的所有字段,但不會真正釋放掉字段所佔用的內存,而僅僅是將每個字段標誌爲過期。

 

11、 ngx.shared.DICT.flush_expired

  語法:flushed = ngx.shared.DICT:flush_expired(max_count?)

  清除字典上過期的字段,max_count表明上限值,如果爲0或者沒有給出,表明需要清除所有過期的字段,返回值flushed是實際刪除掉的過期字段的數目。

  注意:

  與flush_all方法的區別在於,該方法將會釋放掉過期字段所佔用的內存。

12、 ngx.shared.DICT.get_keys  

  語法:keys = ngx.shared.DICT:get_keys(max_count?)

  從字典上獲取字段列表,個數爲max_count,如果爲0或沒有給出,表明不限定個數。默認值是1024個

  注意:

  強烈建議在調用該方法時,指定一個max_count參數,因爲在keys數量很大的情況下,如果不指定max_count的值,可能會導致字典被鎖定,從而阻塞試圖訪問字典的worker進程。

13、  ngx.shared.DICT.flush_keys

  語法: ngx.shared.DICT:flush_keys(num, time)

  從字典項獲取 key ,數量爲 num , 時間 爲 time 有效。 指定 num 爲了 保證處理數據不會被撐爆內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章