【问题标题】:Multiple-get in one go - Redis一次获取多个 - Redis
【发布时间】:2015-04-28 08:17:07
【问题描述】:

我们如何使用lua脚本来实现multi-get。

假设我将name_last 设置为贝克汉姆,将name_first 设置为大卫。为了一次性获得name_lastname_first,lua 脚本应该是什么?

我可以实现类似的东西:

eval "return redis.call('get',KEYS[1])" 1 foo

获取单个键的值。只是想知道如何增强该脚本部分以只需调用一次 redis 服务器即可获取与所有键(或多个键)相关的值

【问题讨论】:

    标签: lua redis jedis


    【解决方案1】:

    首先,您要将要返回的字段发送到EVAL0 表示没有KEYS,因此可以从ARGV 访问这些参数):

    eval "..." 0 name_last name_first
    

    其次,您可以使用MGET查询各个字段的值:

    local values = redis.call('MGET', unpack(ARGV))
    

    第三,可以将值映射回字段名(每个value的索引对应同一个field):

    local results = {}
    for i, key in ipairs(ARGV) do
      results[key] = values[i]
    end
    return results
    

    你最终要执行的命令是:

    eval "local values = redis.call('MGET', unpack(ARGV)); local results = {}; for i, key in ipairs(ARGV) do results[key] = values[i] end; return results" 0 name_last name_first
    

    【讨论】:

    • 这真的很有帮助。谢谢。
    • 虽然 MGET 解决了这个问题,但我只是想知道 LUA 脚本在这种情况下是否可以发挥作用。根据我在网上阅读的资料,我的理解是 LUA 脚本实际上是一种很好的方法(从流水线向前迈进了一步),我们可以最大限度地减少对 redis 服务器的调用。
    • @user_ab 我似乎误解了你原来的问题。基本上,你想做eval "Return values of name_last and name_first"然后返回{name_last = "Beckham", name_first = "David"}
    • @user_ab Lua 可以帮助您实现 Redis 无法使用其标准命令 API 执行的操作。在这种情况下,Lua 不会比MGET 更好,除非你想在返回值之前做一些服务器端的事情。否则,不要在代码中使用 eval,只需调用 Redis 客户端的 MGET。
    • @Itamar Haber,啊……知道了。有了你的建议,我现在对脚本在redis中的应用有点清楚了。谢谢。
    【解决方案2】:

    对 KEYS 表进行循环,并为每个存储其 GET 响应在您返回的获取中。未经测试的代码:

    local t = {}
    for _, k in pairs(KEYS) do
      t[#t+1] = redis.call('GET', k)
    end
    return t
    

    附:您也可以使用 MGET 代替 btw :)

    【讨论】:

    • 假设我们有 10 个键。根据您的建议,我们不是对 redis 服务器进行 10 次单独调用以获取每个键的值吗?我只想调用一次 redis 服务器并获取 10 个键的所有值。
    • Lua 数组用 {} 声明,例如:local t = { }
    • @xyz 完全正确 - 已修复,谢谢! (我确实写过它未经测试;))
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多