3

我在redis.lua中启动 Redis 连接池,通过从 C 调用,我得到 a redis_lua_state,这个 Lua 状态是全局启动一次,其他线程只能从中获取

当有一个 HTTP 请求(工作线程)时,我需要从中获取一个 redis 连接redis_lua_state,然后新建另一个 Lua 状态以加载其他 Lua 脚本,这些脚本将使用这个 redis 连接与 Redis 通信,如何做到这一点?或者如何设计我的 Lua 脚本使其变得简单?


代码示例:

    /* on main thread, to init redis pool connection */
    lua_State *g_ls = NULL;
    lua_State *init_redis_pool(void) {
            int ret = 0;
            g_ls = luaL_newstate();
            lua_State *ls = g_ls;

            luaL_openlibs(ls);
            ret = luaL_loadfile(ls, "redis.lua");
            const char *err;
            (void)err;

            /* preload */
            ret = lua_pcall(ls, 0, 0, 0);

            lua_getglobal(ls, "init_redis_pool");
            ret = lua_pcall(ls, 0, 0, 0);

            return ls;
    }

    /* worker thread */
    int worker() {
            ...
            lua_State *ls = luaL_newstate();
            ret = luaL_loadfile(ls, "run.lua");

            /* How to fetch data from g_ls? */
            ...
            lua_getglobal(ls, "run")
            ret = lua_pcall(ls, 0, 0, 0)

            lua_close(ls);
            ...
            return 0;
    }
4

2 回答 2

4

如果你的 Lua 状态是分开的,那么就没有办法做到这一点。您的工作线程必须初始化 Redis 连接对其进行处理。

于 2013-05-09T03:29:36.940 回答
4

一种方法是在 C 端实现 Lua 状态之间的复制变量。我在我的 ERP 项目中做过类似的事情,但它需要一些麻烦,尤其是在复制用户数据时。

我所做的是实现某种超级全局变量(我的实例中的 C 类)系统,该系统作为全局表实现__index__newindex它是默认 Lua 全局表的代理。设置全局变量时,__newindex会将其复制到该超级全局变量。当另一个 Lua 状态试图访问该全局时,它会从同一个结构中检索它。

然后 redis 连接可能是一个互斥锁共享,所以当一个状态访问它时,另一个不能,例如。

当然还有访问 Lua 默认全局变量的问题,你也必须注意。

或者,您可以查看Lua lanes,如果这是一个选项(我没有 Redis 经验,所以不知道 Lua 有多开放,但我看到您可以完全访问 C api,所以它应该可以工作)。

于 2013-05-09T05:19:40.120 回答