Redis
 sql >> база данни >  >> NoSQL >> Redis

ServiceStack Redis, как да върнете таблицата Lua като списък

От Lua трябва да върнете Lua Array или JSON обект. 'myTable' звучи като манипулатор, който е валиден само в интерпретатора на Lua. Този манипулатор се почиства непосредствено след обаждането, така че няма да се разпространява на клиента.

Редактиране:трябва да се поддържа проста таблица/масив Lua. Не знам какво се случва тогава, без да гледам сценария.

Вижте също тази SO връзка за допълнителна информация относно атомарността на скриптовете на Lua.

Надявам се това да помогне, TW

След редактиране на ОП:

Това беше оригиналният Lua скрипт на 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

Отговор: Не можете да върнете вложени стойности в връщаната стойност на Lua. Както можете да видите от вашата функция ServiceStack, Lua скрипт връща списък и списъкът не е вложен.

Ето две решения, едното с JSON дава леки допълнителни разходи (но може да е по-лесно при програмиране и е абсолютно безопасно).

a:Използване на 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 също е много приятен и компактен формат за сериализация (използваме го много) и може да бъде върнат по следния начин:

a-alt:Използване на cmsgpack

return cmsgpack.pack(a)

b:Използване на прост масив

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

Това връща:

а :

[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest.lua)" 0 0
"{\"47700415\":\"Hello\",\"47700415_000\":\"World\"}"

б :

[email protected]:~$ redis-cli -p 14312 EVAL "$(cat ~/tw_luatest2.lua)" 0 0
1) "47700415"
2) "Hello"
3) "47700415_000"
4) "World"

Както можете да видите, поставих някои фиктивни данни в HSET .

Мога също да препоръчам тази връзка, малко хубава информация там:intro-to-lua-for-redis-programmers

Един приятен начин за добавяне на стойности към Lua dict може да се види тук:

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. Redis:ZADD по-добър ли е от O(logN), когато вмъкнатият елемент е в началото или в края?

  2. Redis като уникален генератор на атомни идентификатори - безопасен начин за уеб приложение за избягване на състезание

  3. Свързване с Redis, работещ в Docker контейнер от хост машина

  4. Как да използвате СКАНИРАНЕ с опцията МАЧ в Predis

  5. Вграден Redis за Spring Boot