0

问题

将对象数组传递到 Lua 脚本的最佳实践是什么?有没有比将对象转换为 JSON 并cjson在脚本中解析它们更好的方法?

更多上下文

我有流式应用程序,它在 Redis 中保持状态。每秒我们会收到 5-100 个事件,所有操作都在单个事务中完成,以提高性能,如下所示:

RedisCommands<String, String> cmd = getOrCreateRedisClient();
cmd.multi();
for (Event event: listOfEvents) {
   cmd.sadd("users", event.getUserId());
   cmd.sadd("actions", event.getActionId());
   cmd.incrbyfloat("users:" + event.getUserId(), event.getImpact());
}
cmd.exec();

现在我必须将此逻辑移动到 Lua 脚本中。我想将一组事件传递给 Lua 脚本而不是进行多达 100 个脚本调用(每个事件一个)也会更快。我对吗?将事件列表传递给 Lua 脚本的最佳方法是什么?

4

1 回答 1

0

这取决于...

如果你的逻辑在未来不会改变,即你只会使用一个事件的user id, action id, and impact,你可以将这三个元素传递给 Lua:

redis-cli --eval your-script.lua , userid1 actionid1 impact1 userid2 actionid2 impact2 userid3 actionid3 impact3

在这种情况下,您不需要将事件对象转换为 JSON 字符串,Lua 脚本也不需要解析 JSON 字符串,因此应该更快。

但是,如果您的逻辑在未来可能发生变化,即您可能需要使用事件的其他成员,您最好将事件对象转换为 JSON 字符串,并将 JSON 字符串数组传递给 Lua 脚本:

redis-cli --eval your-script.lua , {json1} {json2} {json3}

这样这些更改将对您的代码透明,而您只需要更改 Lua 脚本。

于 2019-08-30T14:54:37.917 回答