【问题标题】:redis lua script vs. single callsredis lua 脚本与单个调用
【发布时间】:2014-04-15 07:56:57
【问题描述】:

我有以下设置:

  • 2 种不同的数据结构:集合、字符串
  • 它们位于不同的命名空间*:collections:**:resources:*
  • 客户对此一无所知,我每次都尝试获取这两个命名空间。
  • 基于exists,我决定最终获得哪个数据结构。
  • 所有对 redis 的调用都是异步完成的 (vert.x redis-mod)

现在我必须决定是作为 lua 脚本还是作为单个命令执行。

我想出的lua脚本:

local path = KEYS[1]
local resourcesPrefix = ARGV[1]
local collectionsPrefix = ARGV[2]

if redis.call('exists',resourcesPrefix..path) == 1 then
    return redis.call('get',resourcesPrefix..path)
elseif redis.call('exists',collectionsPrefix..path) == 1 then
    return redis.call('smembers',collectionsPrefix..path)
else
    return "notFound"
end 

单次调用或lua脚本有什么优缺点吗?

【问题讨论】:

  • 您认为哪些利弊可能相关?速度?还有什么?

标签: lua redis vert.x


【解决方案1】:

在我看来,Redis LUA 脚本很好用。执行时间会很短(要避免长脚本,因为它们会阻塞)。它避免了多次调用,因此减少了总的网络通信时间。因此,如果您进行多次此类呼叫,我认为这是比单个呼叫更好的解决方案。特别是如果您使用 EVALSHA 将脚本缓存在 Redis 中。

【讨论】:

    【解决方案2】:

    是的,LUA 脚本是EVALSHA 调用的最佳解决方案:

    • 您正在使用 redis 异步工作。所以LUA帮助你减少代码数量和代码可读性。
    • LUA case 更快,因为减少了网络通信。

    我认为您只需 2 个命令即可编写代码。您的代码中不需要exists

    local path = KEYS[1]
    local resourcesPrefix = ARGV[1]
    local collectionsPrefix = ARGV[2]
    local ret
    
    set ret = redis.call('get',resourcesPrefix..path)
    if ret then
       return ret
    end  
    set ret = redis.call('smembers',collectionsPrefix..path)
    if ret then
       return ret
    end  
    
    return "notFound" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 2020-11-08
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2016-05-20
      • 2017-06-05
      • 2013-09-29
      相关资源
      最近更新 更多