Từ Lua, bạn cần trả về Lua Array hoặc đối tượng JSON. 'myTable' nghe giống như một tay cầm chỉ hợp lệ bên trong trình thông dịch Lua. Xử lý đó được làm sạch trực tiếp sau cuộc gọi, vì vậy sẽ không được truyền cho máy khách.
Chỉnh sửa:một Bảng / Mảng Lua đơn giản nên được hỗ trợ. Bạn không chắc chắn điều gì đang xảy ra sau đó mà không cần xem kịch bản.
Xem thêm liên kết SO này để biết thêm thông tin về tính nguyên tử của tập lệnh Lua.
Hy vọng điều này sẽ hữu ích, TW
Sau khi chỉnh sửa OP:
Đây là tập lệnh Lua ban đầu của OP:
local a={}
for i = 1, 1, 1 do
a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a
Trả lời: Bạn không thể trả về các giá trị lồng nhau trong giá trị trả về Lua. Như bạn có thể thấy từ hàm ServiceStack của mình, một tập lệnh Lua trả về một danh sách và một danh sách không được lồng vào nhau.
Đây là hai giải pháp, giải pháp với JSON mang lại chi phí nhỏ (nhưng có thể dễ dàng hơn khi lập trình và rất an toàn).
a:Sử dụng cjson
local a={}
for i = 1, 1, 1 do
a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return cjson.encode(a)
MsgPack cũng là một định dạng tuần tự hóa rất đẹp và nhỏ gọn (chúng tôi sử dụng nó rất nhiều), và có thể được trả về như sau:
a-alt:Sử dụng cmsgpack
return cmsgpack.pack(a)
b:Sử dụng một mảng đơn giản
local a={}
for i = 1, 1, 1 do
a[1] = "47700415"
a[2] = redis.call('hget', 'asr:47700415', 'MDEngines')
a[3] = "47700415_000"
a[4] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a
Điều này trả về:
a :
[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
"{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"
b :
[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest2.lua)" 0 0
1) "47700415"
2) "Hello"
3) "47700415_000"
4) "World"
Như bạn có thể thấy, tôi đặt một số dữ liệu giả trong HSET
.
Tôi cũng có thể giới thiệu liên kết này, một số thông tin thú vị trong đó:intro-to-lua-for-redis-programmers
Bạn có thể xem một cách hay để thêm giá trị vào Lua dict tại đây:
local fkeys = redis.call('sinter', unpack(KEYS))
local r = {}
for i, key in ipairs(fkeys) do
r[#r+1] = redis.call('hgetall',key)
end
return r