我有一个存储在Redis中的JSON字符串列表,大致如下:
[
{ "ID": 25, "DomainID": 23455, "Name": "Stuff", "Value": 23 },
{ "ID": 35, "DomainID": 23455, "Name": "Stuff", "Value": 10 }
]
关键字可能是"Event: 23455"之类的。
使用Lua脚本和ServiceStack.Redis,我该如何提取一个匿名对象,其中仅包含值小于20的值?
所以我想要返回的内容应该像这样:
[{ "ID": 35, "Value": 10}]
谢谢。
更新 03/31/2013:
在尝试了建议后,我现在有一个新问题。一个 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);";
有没有了解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);";
很不幸,这段代码没有出现任何错误,但是在ServiceStack RedisClient中却返回了"{}"或空列表。所以我还没有到达目标,但我已经更接近它了。
require
涉及到文件系统交互,因此在 Redis 内部不可用,但是cjson
库已经加载。 - hobbs