ngx lua模組中的共享記憶體字典項API

2021-08-03 23:03:38 字數 4729 閱讀 6206

在ngx_lua模組中使用共享記憶體字典項相關api的前提條件是已經使用lua_shared_dict命令定義了乙個字典項物件,該命令的具體用法為:

語法:lua_shared_dict

該命令主要是定義一塊名為name的共享記憶體空間,記憶體大小為size。通過該命令定義的共享記憶體物件對於nginx中所有worker程序都是可見的,當nginx通過reload命令重啟時,共享記憶體字典項會從新獲取它的內容,當時當nginx退出時,字典項的值將會丟失。下面是乙個具體的例子:

輸出結果是:

$ curl localhost/

setstored

$ curl localhost/get

8$ curl localhost/get

8

可以通過ngx.shared.dict介面獲取共享記憶體字典項物件:

語法:dict = ngx.shared.dict

dict = ngx.shared[name_var]

其中,dict和name_var表示的名稱是一致的,比如上面例子中,dogs =

ngx.shared.dogs

就是dict = ngx.shared.dict

的表達形式,也可以通過下面的方式達到同樣的目的:

dogs = ngx.shared["dogs"]

通過上面的api獲取得到的共享記憶體字典項物件,具有如下相應的介面:

>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的值將不會被返回。

>ngx.shared.dict.get_stale

語法:value, flags, stale = ngx.shared.dict:get_stale(key)

與get方法類似,區別在於該方法對於過期的key也會返回,第三個返回引數表明返回的key的值是否已經過期,true表示過期,false表示沒有過期。

>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!"

)

>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覆蓋!

>ngx.shared.dict.add

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

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

>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"

>ngx.shared.dict.replace

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

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

>ngx.shared.dict.delete

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

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

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

>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".

>ngx.shared.dict.flush_all

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

清除字典上的所有字段,但不會真正釋放掉字段所占用的記憶體,而僅僅是將每個字段標誌為過期。

>ngx.shared.dict.flush_expired

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

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

注意:與flush_all方法的區別在於,該方法將會釋放掉過期欄位所占用的記憶體。

>ngx.shared.dict.get_keys

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

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

注意:強烈建議在呼叫該方法時,指定乙個max_count引數,因為在keys數量很大的情況下,如果不指定max_count的值,可能會導致字典被鎖定,從而阻塞試圖訪問字典的worker程序。

(全文完)

ngx lua模組中的共享記憶體字典項API

在ngx lua模組中使用共享記憶體字典項相關api的前提條件是已經使用lua shared dict命令定義了乙個字典項物件,該命令的具體用法為 語法 lua shared dict 該命令主要是定義一塊名為name的共享記憶體空間,記憶體大小為size。通過該命令定義的共享記憶體物件對於ngin...

ngx Lua模組中的重定向

在nginx中實現重定向可以通過rewrite指令,具體可參考 nginx學習 http rewrite module的rewrite指令 通過lua模組也可以實現同樣的功能,lua模組提供了相關的api來實現重定向的功能,主要有 ngx.exec 語法 ngx.exec uri,args?主要實現...

ngx Lua模組中的加密api介面

在lua模組中提供了多種用於是實現各種字串加密演算法的api介面,主要包括 ngx.crc32 short 語法 digest ngx.crc32 short str 該方法主要是計算給定字串str的迴圈校驗碼 cyclic redundancy code 的摘要,計算出來的結果是乙個很大的整數 n...