0

我有以下设置:

  • 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 脚本有什么优缺点吗?

4

2 回答 2

1

是的,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" 
于 2014-03-12T12:03:32.067 回答
0

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

于 2014-03-11T16:38:11.023 回答