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

Как да проверя за nil/null в Redis Lua cjson?

TL;DR за стойности, върнати от cjson.decode() , използвайте cjson.null за сравнение с null на JSON стойност.

Обяснение:Lua използва nil в таблици, за да маркирате изтрити записи. Ако JSONinc null s бяха преобразувани в Lunatic nil s, декодираните обекти ще бъдат повредени. Следователно, библиотеката cjson използва олекотен тип потребителски данни за представяне на null /nil .

Вашият „call_data“ има поле „date_created“, което е нула – това причинява грешката.

Забавното е, че Redis, подобно на Lua, няма да съхранява стойност nula/null, така че ще трябва или да игнорирате нулеви стойности, или да използвате специална стойност в Redis, за да ги маркирате.

Ако приемем, че ще ги игнорирате, ето един начин да го заобиколите:

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)

Също така, малка оптимизация би била да се пакетират актуализациите, както следва:

  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))

P.S. ако искате, вижте ReJSON, който написах – той е предназначен да помогне с това, което изглежда, че се опитвате да направите.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как ConnectionMultiplexer се справя с прекъсванията?

  2. Как работи SignalR.Redis под капака?

  3. Свързване с Redis To Go с PHP

  4. Heroku Redis - GUI и оптимизация на паметта

  5. TTL за член на набора