【问题标题】:Best way to pass array of objects to Redis Lua script将对象数组传递给 Redis Lua 脚本的最佳方法
【发布时间】:2019-08-30 10:44:54
【问题描述】:

问题

将对象数组传递给 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 脚本的最佳方式是什么?

【问题讨论】:

    标签: redis lua


    【解决方案1】:

    这取决于...

    如果你的逻辑在未来不会改变,即你将只使用user idaction idimpact的事件,你可以将这三个元素传递给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 脚本即可。

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 2017-05-23
      • 2013-06-04
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2019-03-22
      相关资源
      最近更新 更多