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

リストをRedisの構造にネストして、トップレベルを減らすにはどうすればよいですか?

    ほとんどの場合、SADD またはZADD パイプラインコマンドを使用するとより良いでしょう。別のクライアントが間にキーを取得して、不完全なオブジェクトを取得するリスクがある場合は、MULTI/EXECトランザクションを使用してください。

    ハッシュフィールドでリストを文字列化することは、いくつかのケースで正当化される場合があります。

    「キーをすばやく削除する」については、必ずUNLINKを使用してください。 DELの代わりに 。

    文字列化を選択した場合、LuaおよびLuaCJSONライブラリを使用してハッシュフィールドのJSONエンコード配列への挿入と削除をアトミックにサポートする方法は次のとおりです。

    挿入

    local items = cjson.decode(redis.call('HGET', KEYS[1], 'items'))
    table.insert(items, ARGV[1])
    return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))
    

    値で削除

    local items = cjson.decode(redis.call('HGET', KEYS[1], 'items'))
    local pos = -1;
    for i, v in ipairs(items) do
        if ARGV[1] == v then
            pos = i
            break
        end
    end
    if pos == -1 then
        return -1
    else
        table.remove(items, pos)
        return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))
    end
    

    使用例

    > HGETALL meta_key
    1) "user"
    2) "12345"
    3) "tag"
    4) "D12321341234123"
    5) "items"
    6) "{}"
    > EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n table.insert(items, ARGV[1]) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))" 1 meta_key value1
    (integer) 0
    > HGETALL meta_key
    1) "user"
    2) "12345"
    3) "tag"
    4) "D12321341234123"
    5) "items"
    6) "[\"value1\"]"
    > EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n table.insert(items, ARGV[1]) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items))" 1 meta_key value2
    (integer) 0
    > HGETALL meta_key
    1) "user"
    2) "12345"
    3) "tag"
    4) "D12321341234123"
    5) "items"
    6) "[\"value1\",\"value2\"]"
    > EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n local pos = -1; \n for i, v in ipairs(items) do \n     if ARGV[1] == v then \n     pos = i \n     break \n end \n end \n if pos == -1 then \n     return -1 \n else \n     table.remove(items, pos) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items)) \n end" 1 meta_key value1
    (integer) 0
    > HGETALL meta_key
    1) "user"
    2) "12345"
    3) "tag"
    4) "D12321341234123"
    5) "items"
    6) "[\"value2\"]"
    > EVAL "local items = cjson.decode(redis.call('HGET', KEYS[1], 'items')) \n local pos = -1; \n for i, v in ipairs(items) do \n     if ARGV[1] == v then \n     pos = i \n     break \n end \n end \n if pos == -1 then \n     return -1 \n else \n     table.remove(items, pos) \n return redis.call('HSET', KEYS[1], 'items', cjson.encode(items)) \n end" 1 meta_key value3
    (integer) -1
    > HGETALL meta_key
    1) "user"
    2) "12345"
    3) "tag"
    4) "D12321341234123"
    5) "items"
    6) "[\"value2\"]"
    


    1. MongoDBでhideIndex()がどのように機能するか

    2. MongoDBからDynamoDBへの移行、パート2

    3. Node.js Mongooseを使用してドキュメントを削除するにはどうすればよいですか?

    4. Javaでシリアル化されたRedisキーを修正する方法