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

REDISのSCAN/HSCANコマンドのCOUNTの推奨値はありますか?

    デフォルト値は10です 。これは、コマンドが多かれ少なかれ10個のキーを戻すことを意味します 、キーがハッシュスロットにまばらに配置されているか、MATCHによって除外されている場合は、少なくなる可能性があります。 パターン。一部のキーがハッシュスロットを共有している場合は、さらに多くなる可能性があります。とにかく、実行される作業はCOUNTに比例します パラメータ。

    Redisはシングルスレッドです。 SCANの理由の1つ 導入されたのは、一度にいくつかの手順を実行することで、サーバーを長時間ブロックすることなく、すべてのキーを通過できるようにすることです。

    そして、それはまさに、何が適切な数であるかを決定するための基準です。どのくらいの期間ブロックしますか SCANを実行してRedisサーバーを実行します 指図。 COUNTが高いほど 、ブロックが長くなります。

    Luaスクリプトを使用して、COUNTの意味を理解しましょう。 影響。サーバーリソースに基づいて結果を取得するには、環境で使用してください。

    Luaスクリプト:

    local t0 = redis.call('TIME')
    local res = redis.call('SCAN', ARGV[1], 'COUNT', ARGV[2])
    local t1 = redis.call('TIME')
    local micros = (t1[1]-t0[1])*1000000 + t1[2]-t0[2]
    table.insert(res,'Time taken: '..micros..' microseconds')
    table.insert(res,'T0: '..t0[1]..string.format('%06d', t0[2]))
    table.insert(res,'T1: '..t1[1]..string.format('%06d', t1[2]))
    return res
    

    ここでは、Redis TIMEを使用します 指図。コマンドは次を返します:

    • UNIX時間(秒)
    • マイクロ秒

    100万個のキーを使用して、私のマシンでいくつか実行します:

    COUNT    TIME IN MICROSECONDS
       10            37
      100           257
     1000          1685
    10000         14438
    

    これらの時間には、ソケットからの読み取り、および応答のバッファリングと送信に使用される時間は含まれないことに注意してください。実際の時間は大きくなります。ネットワークを移動する時間は、Redisサーバーがブロックされる時間ではありません。

    これが私がLuaスクリプトとその結果を呼んだ方法です:

    > EVAL "local t0 = redis.call('TIME') \n local res = redis.call('SCAN', ARGV[1], 'COUNT', ARGV[2]) \n local t1 = redis.call('TIME') \n local micros = (t1[1]-t0[1])*1000000 + t1[2]-t0[2] \n table.insert(res,'Time taken: '..micros..' microseconds') \n table.insert(res,'T0: '..t0[1]..string.format('%06d', t0[2])) \n table.insert(res,'T1: '..t1[1]..string.format('%06d', t1[2])) \n return res" 0 0 5
    1) "851968"
    2) 1) "key:560785"
       2) "key:114611"
       3) "key:970983"
       4) "key:626494"
       5) "key:23865"
    3) "Time taken: 36 microseconds"
    4) "T0: 1580816056349600"
    5) "T1: 1580816056349636"
    



    1. RedisSCANマッチング

    2. 一言で言えばClouderaオペレーショナルデータベースレプリケーション

    3. phpmongodb全文検索と並べ替え

    4. MongoDBの配列の特定の位置に値を挿入します