日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ngx_lua模块中的共享内存字典项API

發布時間:2024/9/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ngx_lua模块中的共享内存字典项API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在ngx_lua模塊中使用共享內存字典項相關API的前提條件是已經使用lua_shared_dict命令定義了一個字典項對象,該命令的具體用法為:

?

語法:lua_shared_dict <name> <size>

?

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

?

http {lua_shared_dict dogs 10m;server {location /set {content_by_lua 'local dogs = ngx.shared.dogsdogs:set("Jim", 8)ngx.say("STORED")';}location /get {content_by_lua 'local dogs = ngx.shared.dogsngx.say(dogs:get("Jim"))';}}}

?

輸出結果是:

?

$ curl localhost/setSTORED$ curl localhost/get8$ curl localhost/get8

?

可以通過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.catslocal value, flags = cats.get(cats, "Marry")

?

等價于

?

local cats = ngx.shared.catslocal 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.catslocal succ, err, forcible = cats.set(cats, "Marry", "it is a nice cat!") ? 等價于 ? local cats = ngx.shared.catslocal 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進程。

?

(全文完)


來源:http://blog.csdn.net/weiyuefei/article/details/38487475

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的ngx_lua模块中的共享内存字典项API的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。