Redis Lua脚本和单个调用的比较

我有以下设置:

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

点赞
用户1392658
用户1392658

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

2014-03-11 16:38:11
用户2982437
用户2982437

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

  • 您正在使用异步的 Redis。所以 LUA 可以帮助您减少代码的数量和代码的可读性。
  • 由于减少了网络通信,LUA case 更快。

我认为你只需使用2个命令就可以编写你的代码。您的代码中不需要 exists

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

ret = redis.call('get',resourcesPrefix..path)
if ret then
   return ret
end
ret = redis.call('smembers',collectionsPrefix..path)
if ret then
   return ret
end

return "notFound"
2014-03-12 12:03:32