在 Redis 中使用 Lua 脚本时,可以通过 return
返回一个 Table(表),但需要注意 Redis 对 Lua 返回值的处理规则。以下是详细说明和示例:
1. Lua 脚本返回 Table 的规则
- Redis 会将 Lua Table 自动转换为 RESP(Redis Serialization Protocol)格式的多行回复。
- Table 中的元素会被按顺序转换为多行返回值(类似数组)。
- 嵌套 Table 会被递归展开。
2. 示例:直接返回 Table
-- 返回一个简单 Table
local result = { "apple", "banana", "cherry" }
return result
Redis CLI 执行结果:
1) "apple"
2) "banana"
3) "cherry"
3. 示例:返回嵌套 Table
-- 返回嵌套 Table(会被递归展开)
local nested = {
"fruit",
{ "red", "green" },
42,
{ price = 9.99 } -- Hash 部分会被忽略(需特殊处理)
}
return nested
Redis CLI 执行结果:
1) "fruit"
2) 1) "red"
2) "green"
3) (integer) 42
4) (empty array) -- price=9.99 不会被返回!
4. Key-Value Pair(键值对)的特殊处理
如果希望返回类似 Hash/Dict的结构,需要手动转换为数组格式:
local data = { name = "Alice", age = 30 }
-- 手动转为 Array-like Table
return { data.name, data.age }
结果:
1) "Alice"
2) (integer) 30
5. C++/Python客户端如何接收?
以 Python (redis-py
)为例:
import redis
r = redis.Redis()
script = """
local result = { "key1", "value1", {100,200} }
return result
"""
output = r.eval(script, numkeys=0)
print(output)
# Output: [b'key1', b'value1', [b'100', b'200']]
6.注意事项
- 空值处理: Lua
nil
→ Redisnull
(如{nil,123}
→[nil,"123"]
)。 - 性能优化: Lua脚本应避免返回超大Table,可能阻塞Redis主线程。
- 类型转换: Redis会将所有数字转为整数或字符串。
如果需要更复杂的结构化数据,建议用 JSON序列化后返回字符串:
“`lua
local json_data = cjson.encode({ a=1, b={2,3} })
return json_data – Client需反序列化JSON
内容由零声教学AI助手提供,问题来源于学员提问