Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

ServiceStack Redis, cách trả lại bảng Lua dưới dạng Danh sách

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Máy tính để bàn Redis Vue

  2. Cách sử dụng Redis từ Node.js

  3. Redisson, hàng đợi làm việc / dequeu. Chiến lược xử lý thông báo / phần tử xử lý thông báo không hoàn chỉnh khi hệ thống / nhóm ngừng hoạt động

  4. Lợi ích của việc phân cụm Redis trên các máy chủ khác nhau là gì?

  5. Redis - Khóa HASH và SET và ZSET có liên quan như thế nào trên bản lưu CrudRepository?