我正在尝试让 Redis 允许 EVAL (http://redis.io/commands/EVAL)发出 HTTP 请求。
两个模块:LuaCURL 和 Luasocket 赋予了这种能力。Redis 源代码有一个目录,其中包含附加模块(例如 cjson)http://download.redis.io/redis-stable/deps/lua/src/,我尝试添加 luacurl.c,但收到一个又一个错误。我设法通过编辑 scripting.c 启用 os.execute 来编译它,这允许我运行 curl 命令,但这是一个糟糕的解决方案。
如何在Redis的Lua中编译HTTP请求?
据推测,最简单的方法是拥有一个独立的 luasocket.so 文件,但我不确定如何做到这一点。
答案1
不用担心,我所需要的只是睡一晚来保持头脑清醒。
我下载了http://files.luaforge.net/releases/luacurl/luacurl并将 luacurl.c 移至 /deps/lua/src/ 文件夹,并编辑第 23 行
#include <lauxlib.h>
到
#include "lauxlib.h"
然后在 /deps/lua/src/Makefile (Lua 的 makefile,而不是 Redis 的)中转到第 30 行并找到
lua_cjson.o
在其旁边添加“luacurl.o”,如下所示
lua_cjson.o luacurl.o
然后在 /src/Makefile (Redis 的 makefile,不是 Lua 的)中将第 54 行从
FINAL_LIBS=-lm
到
FINAL_LIBS=-lm -lcurl
最后确保你已经安装了“yum install curl-devel”,然后编译它。
请记住,当服务器忙于 Lua 脚本时,其他客户端无法执行命令。
答案2
在 Redis 中安装自定义 Lua 模块需要从源代码重新编译 Redis,使用 user3786834 列出的程序。如果您确实需要使用某个特定模块,那么这可能是您唯一的选择。
但是,如果您的库仅使用 Lua 代码(没有 C 代码),那么最简单的选择(这也会提高应用程序的可移植性)可能是将该模块的源代码直接包含到您的 EVAL 脚本中。