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))
我正在尝试将 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))