redis的lua脚本多返回值
如何在redis的lua中返回不同类型的多个返回值? 如何在redis的lua中返回不同类型的多个返回值?
lua脚本的函数支持多返回值,若redis调用lua脚本支持多返回值,会使一些开发场景简单。但遗憾的是经过试验,redis不支持这一特性。
测试脚本如下: 测试脚本如下:
test.lua -> test.lua ->
local function test(val)
return 1, val
end
return test(KEYS[1])
local function test(val) return 1, val end return test(KEYS[1])
return 1, val
end
return test(KEYS[1])
local function test(val) return 1, val end return test(KEYS[1])
使用redis执行脚本: 使用redis执行脚本:
redis-cli --eval test.lua 1 3 redis-cli --eval test.lua 1 3
结果: 结果:
(integer) 1 (integer) 1
由上可见,redis只返回第一个值。 由上可见,redis只返回第一个值。
一种做法是,利用lua的table,将不同类型的值放入table,最后返回table。 一种做法是,利用lua的table,将不同类型的值放入table,最后返回table。
测试脚本如下: 测试脚本如下:
test.lua -> test.lua ->
local function test(val)
local ret1 = {1, 2}
local ret2 = "hello"
local ret3 = val
local ret = {}
ret[1] = ret1
ret[2] = ret2
ret[3] = ret3
return ret
end
return test(KEYS[1])
local function test(val) local ret1 = {1, 2} local ret2 = "hello" local ret3 = val local ret = {} ret[1] = ret1 ret[2] = ret2 ret[3] = ret3 return ret end return test(KEYS[1])
local ret1 = {1, 2}
local ret2 = "hello"
local ret3 = val
local ret = {}
ret[1] = ret1
ret[2] = ret2
ret[3] = ret3
return ret
end
return test(KEYS[1])
local function test(val) local ret1 = {1, 2} local ret2 = "hello" local ret3 = val local ret = {} ret[1] = ret1 ret[2] = ret2 ret[3] = ret3 return ret end return test(KEYS[1])
执行脚本: 执行脚本:
redis-cli --eval test.lua 1 3 redis-cli --eval test.lua 1 3
结果: 结果:
1) 1) (integer) 1
2) (integer) 2
2) "hello"
3) "1" 1) 1) (integer) 1 2) (integer) 2 2) "hello" 3) "1"
2) (integer) 2
2) "hello"
3) "1" 1) 1) (integer) 1 2) (integer) 2 2) "hello" 3) "1"
可见,结果已经返回。 可见,结果已经返回。
需要注意的是,使用jedis取结果时,需要将结果以List<Object>接收,之后对每个item转换为相应的类型再处理。 需要注意的是,使用jedis取结果时,需要将结果以List
