Redis:如何从 Lua 脚本中 HMSET 字典?

Redis: How to HMSET a dictionary from a Lua script?

我正在尝试将 Python 字典作为参数传递给 Lua 脚本,然后 HMSET 将其传递给脚本中的 Redis 密钥。

我有两个问题。

我应该如何将字典从 Python 传递到 Lua 脚本以及从 Lua 脚本传递到 Redis?

将其传递给 Lua 似乎很简单,只需 json.dumps()。但是,如何在 Lua 中将它转换回字典(或者 Lua table 我猜?)(我不能使用 Lua 的 require在 Redis 中 EVAL).

虽然我仍然不知道如何从 Lua 向 Redis 传递真正的字典,但我仍在玩 Lua 脚本中的 HMSET 并尝试分配给键一个字符串。

为什么会出现此错误:

redis.exceptions.ResponseError: Error running script (call to f_2591f0a1987b36dd027b752af3591c92be845cd4):
@user_script:7: @user_script: 7: Wrong number of args calling Redis command From Lua script

前提是我的 Lua 代码使用与我的 Python 相同数量的参数 HMSET:

local key_name = KEYS[1]
redis.call('hmset', key_name, "some_val")

首先,请注意 Pythonic dict 与 Redis Hash 不同:虽然 dict 可以将任何类型存储为值并支持嵌套,但 hash 只有 1-深入并存储字符串。因此,如果您的字典是嵌套的 and/or 包含非字符串值,则映射是非常重要的。

现在,假设字典确实是非嵌套的。

How am I supposed to pass the dict from Python to Lua script and from the Lua script to Redis?

当您传递 JSONified 表示时,您可以使用 Redis' Lua cjson library 将其解析为 Lua table,例如:

local dict = cjson.decode(ARGS[1])

Why am I getting this error:

出现此错误是因为您在没有字段名称参数的情况下调用 HMSET(顺便说一句,已弃用,已被 HSET 取代)。正确的方法(即将字典保存到散列中)如下所示:

local key_name = KEYS[1]
local dict = cjson.decode(ARGS[1])
for k, v in pairs(dict) do
  redis.call('HSET', key_name, k, v)
end

或者这个稍微快一点的变体:

local key_name = KEYS[1]
local dict = cjson.decode(ARGS[1])
local payload = {}
for k, v in pairs(dict) do
  table.insert(payload, k)
  table.insert(payload, v)
end
redis.call('HSET', key_name, unpack(payload))