来自 JSON 的 Redis 中的 Lua

Chr*_*isS 6 lua redis servicestack.redis

我有一个存储在 Redis 中的 JSON 字符串列表,如下所示:

[
   { "ID": 25, "DomainID": 23455, "Name": "Stuff", "Value": 23 }, 
   { "ID": 35, "DomainID": 23455, "Name": "Stuff", "Value": 10 }
]
Run Code Online (Sandbox Code Playgroud)

关键是类似于“事件:23455”。

使用 Lua 脚本和 ServiceStack.Redis 如何提取仅包含值小于 20 的值的匿名对象?

所以我想返回的内容如下所示:

[{ "ID": 35, "Value": 10}]
Run Code Online (Sandbox Code Playgroud)

谢谢。

2013 年 3 月 31 日更新:

在尝试了建议的内容后,我现在遇到了一个新问题。Lua 脚本语法错误。

我收到一个关于“在 cjson 附近期待 '='”的 Lua 语法错误。这是我提供给 Redis 的 Lua 脚本字符串(在 C# 中):

string luaScript = "local tDecoded = cjson.decode(redis.call('GET', KEYS[1]));"
+ "local tFinal = {};"
+ "for iIndex, tValue in ipairs(tDecoded) do"
+ "     if tonumber( tValue.Value ) < 20 then"
+ "        table.insert(tFinal, { ID = tValue.ID, Value = tValue.Value});"
+ "     end"
+ "end"
+ "return cjson.encode(tFinal);";
Run Code Online (Sandbox Code Playgroud)

有没有 Lua 或 Redis Lua 专家可以看出可能是什么问题?即 Lua 语法看起来正确吗?

更新 04/02/2013

通过像这样在每行的末尾添加 \n 换行符来解决解析错误。

string luaScript = "local tDecoded = redis.call('GET', KEYS[1]);\n"
+ "local tFinal = {};\n"
+ "for iIndex, tValue in ipairs(tDecoded) do\n"
+ "     if tonumber( tValue.Value ) < 20 then\n"
+ "        table.insert(tFinal, { ID = tValue.ID, Value = tValue.Value});\n"
+ "     else\n"
+ "         table.insert(tFinal, { ID = 999, Value = 0});\n"
+ "     end\n"
+ "end\n"
+ "return cjson.encode(tFinal);";
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有错误,但由于某种原因只返回“{}”或 ServiceStack RedisClient 中的空列表。所以我还没有到那里,但我更近了一步。

hjp*_*r92 3

您可以使用GitHub 上提供的 LuaJSON,也可以尝试使用此 JSON 到 Lua 表解析器来完成该任务。用法如下(对于 GitHub 链接):

local json = require( "json" )  -- or JSON.lua
local tDecoded = json.decode(sJSON)  -- sJSON is the original JSON string

local tFinal = {}

for iIndex, tValue in ipairs( tDecoded ) do
    if tonumber( tValue.Value ) < 20 then
        table.insert( tFinal, { ID = tValue.ID, Value = tValue.Value} )
    end
end

print( json.encode(tFinal) )
Run Code Online (Sandbox Code Playgroud)

  • `require` 在 Redis 中不可用,因为它意味着文件系统交互,但 `cjson` 库已经加载。 (17认同)