redis lua脚本与单个电话

时间:2014-03-11 15:37:25

标签: lua redis vert.x

我有以下设置:

  • 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脚本是否有任何优缺点?

2 个答案:

答案 0 :(得分:0)

看起来我很好地使用了Redis LUA脚本。执行时间很短(要阻止长脚本)。它避免了多次呼叫,因此减少了总的网络通信时间。所以我认为,如果你打了很多这样的电话,它比单个电话更好。特别是如果您使用EVALSHA将脚本缓存在Redis中。

答案 1 :(得分:0)

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

  • 你正在使用redis异步。因此LUA可帮助您减少代码数量和代码可读性。
  • LUA由于减少网络通信,情况更快。

我认为你可以用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"