Redisチュートリアル-Pipeline

1862 ワード

Pipelineコンセプト


Redisクライアントが実行するコマンドは、次の4つのプロセスに分けられます.
  • 送信コマンド
  • コマンドキュー
  • コマンド実行
  • は結果
  • を返す.
    このうち、1〜4をRound Trip Time(RTT、往復時間)と呼ぶ.
    Redisは、mset、mgetなどの一括操作コマンドを提供し、RTTを効率的に節約します.しかし、ほとんどのコマンドは一括操作をサポートしていません.例えば、hgetallコマンドをn回実行するには、mhgetallコマンドが存在せず、RTTをn回消費する必要があります.Redisのクライアントとサービス側は、異なるマシンに配備される可能性があります.例えば、クライアントは北京にあり、Redisサーバは上海にあり、両地は直線距離1300キロであり、1回のRTT時間=1300 x 2/300000 x 2/3)=13ミリ秒(真空中の光の伝送速度は30万キロ/秒であり、ここでは光ファイバが光速の2/3であると仮定する)では、クライアントは1秒以内に約80回程度の命令しか実行できず、このRedisの高同時高スループット特性は逆行する.
    Pipeline(パイプライン)メカニズムは、上記のような問題を改善することができ、Redisコマンドのセットを組み立て、一度のRTTでRedisに転送し、このRedisコマンドの実行結果をクライアントに順次返すことができる.

    Jedis Pipeline使用


    maven依存:
    
        redis.clients
        jedis
        2.9.0
    
    

    Pipelineの操作は次のとおりです.
    JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");
    try (Jedis jedis = pool.getResource()) {
        //1.  Pipeline 
        Pipeline p = jedis.pipelined();
        p.set("fool", "bar"); 
        p.zadd("foo", 1, "barowitch");  
        p.zadd("foo", 0, "barinsky"); 
        p.zadd("foo", 0, "barikoviev");
        Response pipeString = p.get("fool");
        Response> sose = p.zrange("foo", 0, -1);
        // 2.   
        p.sync(); 
    
        int soseSize = sose.get().size();
        Set setBack = sose.get();
    }
    
    pool.destroy();
    

    原生ロットコマンドとPipelineですね


    Pipelineを使用してバッチ操作の効果をシミュレートできますが、使用時には、元のバッチコマンドとの違いに注意してください.主に以下の点が含まれています.
  • 原生ロットコマンドは原子であり、Pipelineは非原子の
  • である.
  • オリジナルバッチコマンドは、複数のkeyに対応するコマンドであり、Pipelineは複数のコマンド
  • をサポートする.
  • オリジナルバッチコマンドはRedisサービス側のサポートによって実現するが、Pipelineはサービス側とクライアントの共同協力
  • を必要とする.