【问题标题】:Lua execution in Redis - Atomicity & Scale?Redis 中的 Lua 执行 - 原子性和规模?
【发布时间】:2015-10-21 14:54:14
【问题描述】:

我在 Redis <K,V> 中有一些键,其中 V 是逗号分隔的子字符串 V: <v1,v2,v3,...,vn>

到目前为止,我只是在 Jedis(Java 中的 Redis API)中使用事务来设置密钥。但是一个新的需求需要我对现有的键执行一些操作。所以我有两个选择:

  1. 检索密钥、执行操作、设置密钥
  2. 在 Lua 中对操作进行编码,并将文件与键一起作为参数传递。

选项 2 似乎更快,因为它可以节省往返行程,但我有以下考虑:

  1. 如果在 Redis 之间 Lua 执行失败怎么办,比如在 n 个键之后。 (可能是脚本或 Redis 的问题)。 Redis 是否保证一致性?在选项 1 中,我可以中止写入并防止出现不一致的状态。
  2. 据我所知,Lua 脚本将键作为参数。但是我需要操作 1000 万个键。 Lua 是否可以处理如此庞大的参数列表?

我的解决方案

正如下面的答案所说,它们都不是一个可行的选择。我用 C 编写了自己的 Redis 命令并编译了源代码。所以现在我会打电话给

redis-cli> MyCommand K V

对于管道中的每个<K,V>。我按照这里的教程-Hacking Redis。但是可能还不够,需要自己浏览和理解一些代码!

【问题讨论】:

    标签: lua redis


    【解决方案1】:

    wrt #1 - Lua 脚本是原子的,但它提供这种类型的一致性保证。如果脚本失败,其更新将不会由 Redis 自动回滚。有一个改进这种行为的建议,但它尚未被 Redis 接受(请参阅 Josiah Carlson 的博客:http://www.dr-josiah.com/2015/07/transactions-in-redis.html

    wrt #2 - 我不知道如此庞大的列表是否会顺利进行,但如果你需要它,你可能用错了;)

    【讨论】:

    • 感谢您的回答。我想我对一致性的预感是正确的。我需要编辑 1000 万个键的值。但是我已经用 C 编写了自己的自定义函数并插入了 Redis。目前它运作良好。 PS:那是一个不错的博客。感谢您的引用。我正在关注它。
    • 博士。卡尔森是社区的基石之一,他的博客确实不错(虽然钍反应堆的东西在 imo 中有点牵强) - 我将今天的虚拟摩卡杯献给他:redislabs.com/redis-watch-archive/52 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-02-17
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多