在 lua 中使用 redis 获取表格

我正在 Nginx 上运行 LUA,决定通过 Redis 获取一些变量。我在 LUA 中使用表格。它是这样的;

local ip_blacklist = {
"1.1.1.1",
"1.1.1.2",
}

我在 Nginx 上打印;

1.1.1.1
1.1.1.2

我希望将这些值保留在 Redis 中而不是 Lua 中。我的 redis:http://prntscr.com/10sv3ln

我的 Lua 命令;

local ip = red:hmget("iplist", "ip_blacklist")

我在 Nginx 上打印;

{"1.1.1.1","1.1.1.2",}

它的数据不以表格形式出现,函数无法使用。我该如何像使用本地 ip_blacklist 那样调用这些数据?

点赞
用户9783845
用户9783845

Redis 哈希是在字符串字段和字符串值之间的映射。

你不能直接将 LuaTable 存储为哈希值。据我理解,您使用 RedisInsight 存储了一个字面字符串 {"1.1.1.1","1.1.1.2",},但它不是这样工作的。

您可以使用 JSON 进行序列化:

server {
    location / {
        content_by_lua_block {
            local redis = require('resty.redis')
            local json = require('cjson.safe')

            local red = redis:new()
            red:connect('127.0.0.1', 6379)

            -- 设置一个带有 JSON 数组的字符串作为哈希值;您可以使用 RedisInsight 完成此步骤
            red:hset('iplist', 'ip_blacklist', '["1.1.1.1", "1.1.1.2"]')

            -- 将哈希值读取为一个字符串(序列化的 JSON 数组)
            local ip_blacklist_json = red:hget('iplist', 'ip_blacklist')
            -- 将 JSON 数组解码为 LuaTable
            local ip_blacklist = json.decode(ip_blacklist_json)

            ngx.say(type(ip_blacklist))
            for _, ip in ipairs(ip_blacklist) do
                ngx.say(ip)
            end
        }
    }
}

输出:

table
1.1.1.1
1.1.1.2
2021-03-23 12:23:42