【问题标题】:Will redis lua scripting increase read performance in this case?在这种情况下,redis lua 脚本会提高读取性能吗?
【发布时间】:2020-12-10 06:14:51
【问题描述】:

假设我们已经简化了具有以下实体的在线商店:产品、相关产品和类别。关系很简单:

  • 产品与类别相关联
  • 产品有相关产品
  • 产品价格因地区而异

所有实体在 Redis 中都存储为 json 字符串,类似于:

产品(及相关产品):{"productId":1, "title": "Product", "relatedProductIds":[4,5,6], "categoryIds":[1,2,3]}

产品价格:{"price": 555.5, "region": "eu"}

分类:{"categoryId": 12, "title": "Category"}

我们的任务是从 redis 中获取 整棵树 以获得一些产品 ID:产品、产品类别、产品价格、产品相关产品、相关产品类别、相关产品价格。从客户端执行此操作是可以的,但需要多次请求 redis。整个过程可以这样描述:

  • 获取所有必需的产品和价格,并对其进行 json 解码。现在我们知道了主要产品类别和相关产品 ID 的列表。
  • 获取相关产品的类别、相关产品和价格,并对其进行 json 解码。现在我们知道了相关产品类别的列表。
  • 获取相关产品类别。

它可以运行而且运行速度非常快,但是这可以使用 redis lua 脚本来完成吗?我打算通过lua完成这项工作,组合一个大json(或多个小json)并返回给客户端。值得做吗?为什么?

谢谢你,对不起我的英语。

【问题讨论】:

  • 您是在单个 Redis 上运行还是在集群 Redis 上运行?
  • @GuyKorland 你好!所有实体都存储在单个实例上,但我们有多个实例副本并在它们之间保持平衡。因此,无需去另一个实例寻找某个实体,所有需要的实体都可以在同一个实例中找到。
  • 这些是您存储的真实 JSON 结构,还是包含更多您可能不需要检索的字段?
  • @GuyKorland 不,这是简化的。我们有更多具有更多字段的实体,但我可以创建仅具有关系的光键,例如 - 这不是问题。

标签: redis lua


【解决方案1】:

是的,Lua 脚本可能会给您带来比预期更好的延迟。 特别是如果您不需要检索所有字段,这样您应该减少网络上的数据负载并仅返回相关字段。

顺便说一句,如果您有更复杂的用例,可能需要支持 Redis 集群或更复杂的 JSON,您可能需要检查 https://redisgears.iohttps://redisjson.io

【讨论】:

  • 谢谢!坦率地说,我什至在考虑完全避免在 lua 中进行 json 解码来获取关系 ID。也可以使用简单的正则表达式。
  • RedisJson 真的很有趣。准备好生产了吗?
【解决方案2】:

Lua 脚本的性能取决于您在脚本中执行的操作。由于 Redis 使用单线程命令执行器,如果你的脚本执行时间长,它会阻塞其他命令,使 Redis 响应变慢。

对于您的情况,我建议直接从 Redis 查询不同的数据并在您的应用程序中处理它们的关系。这样一来,Redis 只做数据存储,不做逻辑,做的更纯粹,更快。

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2012-07-04
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多