Redis
 sql >> Database >  >> NoSQL >> Redis

Come verificare nil/null in Lua cjson di Redis?

TL;DR per i valori restituiti da cjson.decode() , usa cjson.null da confrontare con null di JSON valore.

Spiegazione:Lua usa nil nelle tabelle per contrassegnare le voci eliminate. Se JSONinc null s sono stati convertiti in Lunatic nil s, gli oggetti decodificati sarebbero danneggiati. Pertanto, la lib cjson utilizza un tipo di dati utente leggero per rappresentare null /nil .

Il tuo 'call_data' ha un campo 'date_created' nullo, che causa l'errore.

La cosa divertente è che Redis, come Lua, non memorizzerà un valore nil/null, quindi dovrai ignorare i valori null o utilizzare un valore speciale in Redis per contrassegnarli.

Supponendo che li ignorerai, ecco un modo per aggirare il problema:

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)

Inoltre, una piccola ottimizzazione sarebbe quella di raggruppare gli aggiornamenti, in questo modo:

  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 se vuoi, dai un'occhiata a ReJSON che ho scritto:è progettato per aiutarti con ciò che sembra che stai cercando di fare.