Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Jak sprawdzić zero / null w Redis' Lua cjson?

TL;DR dla wartości zwracanych przez cjson.decode() , użyj cjson.null do porównania z null JSON-a wartość.

Wyjaśnienie:Lua używa nil w tabelach, aby zaznaczyć usunięte wpisy. Jeśli JSONinc null s zostały przekonwertowane na Lunatic nil s, zdekodowane obiekty byłyby uszkodzone. Dlatego cjson lib używa lekkiego typu danych użytkownika do reprezentowania null /nil .

Twoje „call_data” ma pole „date_created”, które ma wartość NULL — co powoduje błąd.

Zabawne jest to, że Redis, podobnie jak Lua, nie przechowuje wartości zero/null, więc będziesz musiał albo zignorować wartości null, albo użyć specjalnej wartości w Redis, aby je oznaczyć.

Zakładając, że będziesz je ignorować, oto jeden sposób:

local call_data     = cjson.decode(ARGV[1])
local other_data    = cjson.decode(ARGV[2])
local data          = {}
local next          = next
local null          = cjson.null
local populate_data = function(source)
  if next(source) == nil then
    return
  end

  for property,value in pairs(source) do
    if value ~= null then
      redis.call('HSET', KEYS[2], property, value)
    end
  end
end
populate_data(call_data)
populate_data(other_data)

Ponadto niewielka optymalizacja polegałaby na grupowaniu aktualizacji, na przykład:

  local payload = {}
  for property,value in pairs(source) do
    if value ~= null then
      table.insert(payload, property)
      table.insert(payload, value)
    end
  end
  redis.call('HSET', KEYS[2], unpack(payload))

PS jeśli chcesz, spójrz na ReJSON, który napisałem – ma pomóc w tym, co wydaje się, że próbujesz zrobić.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zwrócić Redis primaryKey za pośrednictwem danych wyjściowych szablonu ARM?

  2. Pętla for w redis z asynchronicznymi żądaniami nodejs

  3. Jak mogę sprawdzić, czy moja pamięć podręczna redis działa?

  4. chcesz uruchomić redis-server w tle bez przerwy

  5. Wydajny pamięciowo sposób przechowywania 32-bitowych liczb całkowitych ze znakiem w Redis