Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

ServiceStack Redis, cara mengembalikan tabel Lua sebagai Daftar

Dari Lua, Anda perlu mengembalikan Array Lua, atau objek JSON. 'myTable' terdengar seperti pegangan yang hanya valid di dalam interpreter Lua. Pegangan itu dibersihkan langsung setelah panggilan, jadi tidak akan disebarkan ke klien.

Sunting:Tabel/Array Lua sederhana harus didukung. Tidak yakin apa yang terjadi, tanpa melihat naskahnya.

Lihat juga tautan SO ini untuk beberapa info tambahan tentang atomisitas skrip Lua.

Semoga membantu, TW

Setelah mengedit OP:

Ini adalah skrip Lua asli 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

Jawaban: Anda tidak dapat mengembalikan nilai bersarang dalam nilai pengembalian Lua. Seperti yang Anda lihat dari fungsi ServiceStack Anda, skrip Lua mengembalikan sebuah daftar, dan sebuah daftar tidak bersarang.

Berikut adalah dua solusi, solusi dengan JSON memberikan sedikit overhead (tetapi mungkin lebih mudah saat memprogram, dan tidak aman).

a:Menggunakan 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 juga merupakan format serialisasi yang sangat bagus dan ringkas (kami sering menggunakannya), dan dapat dikembalikan seperti ini:

a-alt:Menggunakan cmsgpack

return cmsgpack.pack(a)

b:Menggunakan array sederhana

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

Ini mengembalikan:

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"

Seperti yang Anda lihat, saya menaruh beberapa data dummy di HSET .

Saya juga dapat merekomendasikan tautan ini, beberapa info bagus di sana:intro-to-lua-for-redis-programmers

Cara yang bagus untuk menambahkan nilai ke dict Lua dapat dilihat di sini :

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. kompilasi klien redis kustom gagal

  2. Apakah Redis menggunakan nama pengguna untuk otentikasi?

  3. Bagaimana cara menyimpan dan keluar dari redis.conf?

  4. Twisted:mengapa melewatkan panggilan balik yang ditangguhkan ke utas yang ditangguhkan membuat utas tiba-tiba memblokir?

  5. Jendela tumpukan tidak menunjukkan keluaran saat men-debug skrip Redis Lua dengan ZeroBrane