ngx_lua模块中使用lua_shared_dict共享内存变量

April 19, 2021

本文介绍了在ngx_lua模块中如何使用lua_shared_dict命令定义共享内存字典项对象,并通过ngx.shared.DICT接口获取这些对象。文章详细解释了相关语法和示例,包括如何设置和获取共享内存上的值。同时,还讨论了在Nginx重启和退出时,共享内存字典项的行为。

lua_shared_dict

在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.dogs
                dogs:set("Jim", 8)
                ngx.say("STORED")
            ';
        }
        location /get {
            content_by_lua '
                local dogs = ngx.shared.dogs
                ngx.say(dogs:get("Jim"))
            ';
        }
    }
}

输出结果是:

$ curl localhost/set
STORED
 
$ curl localhost/get
8
 
$ curl localhost/get
8

ngx.shared.DICT

可以通过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的值将不会被返回。

Lualua_shared_dict

IARNO

服务端开发

限流算法实践

openresty 跑定时任务配置、ngx.timer.every接口使用