sql >> データベース >  >> NoSQL >> Redis

RedisのLuacjsonでnil/nullを確認するにはどうすればよいですか?

    cjson.decode()によって返される値のTL;DR 、cjson.nullを使用します JSONのnullと比較します 値。

    説明:Luaはnilを使用しています 削除されたエントリをマークするためにテーブルで。 JSONinc nullの場合 sはLunaticnilに変換されました s、デコードされたオブジェクトが破損します。したがって、cjsonlibは軽量のuserdataタイプを使用してnullを表します / nil

    'call_data'にはnullの'date_created'フィールドがあります-これがエラーの原因です。

    面白いことに、LuaのようにRedisはnil / null値を保存しないため、null値を無視するか、Redisで特別な値を使用してフラグを立てる必要があります。

    それらを無視すると仮定すると、これを回避する1つの方法があります:

    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. OpsManagerでMongoDBを実行する

    2. mgoを使用したMongoDBでの効率的なページング

    3. RedisのZRANKで同じスコアに対して同じランクを取得するにはどうすればよいですか?

    4. MongoDBのestimatedDocumentCount()