Redisテスト分析(pipelineモード推奨)


テスト環境
Redisテストバージョン:2.2.12
Java Jedisクライアントを使用したテスト
テストデータ量:50万、2億を超える
スピード
1)mset関数の挿入効率が最も高く,Redisの挿入速度は20万個のデータ/秒に達した.しかし、この関数の消費メモリは高く、私たちが実際に1テーブルの毎日2.4億のデータ量を応用するには、32 G近くのメモリを消費する必要があります.
2)mset関数では、m値が200以上になると挿入速度が飽和に近いため、実際の応用では、この値>=200を設定して、最も高い挿入効率を達成しなければならない.
3)set関数は、特定のアプリケーションシーンのニーズを除いて、できるだけ使用しないでください.その挿入効率はmset関数の1/20です.
4)異なる関数にはstringとbyte[]の2つの異なる形式があるが,Redisにとってbyte[]の形式も各byteを1文字と見なして処理する.実際の応用では、長い整数データ(例えば、98242244123)について、byte[]の形式に変換することができ、4つのbyte[]はintデータを格納することができ、stringの形式で格納するよりもメモリのオーバーヘッドの一部を節約することができる.
5)hset関数の挿入効率はset関数に相当する.
6)hmset実際の応用では、各データに対応するkeyが異なるため、自機のキャッシュ容器Map>を維持する必要があるため、挿入速度はmset関数より少し遅い.
メモリ
1)hsetとhmset関数はsetとmset関数より約3分の1のメモリを節約できる.
2)hsetおよびhmset関数は、keyごとに格納されるの数に非常に敏感である.制限を超えると、挿入効率の低下が顕著になり、メモリのオーバーヘッドも大幅に増加します.実際の応用では、keyの下にあるの数が制限を超えないことをできるだけ保証しなければならない(デフォルトは64).
Pipeline
redisのpipeline(パイプ)機能はコマンドラインにはありませんが、redisはpipelineをサポートし、各言語版のclientで対応する実装があります.
Redis自体はcsモードのtcp serverであり、clientは1つのsocketを通じて複数の要求コマンドを連続的に開始することができる.各リクエストコマンドが発行されるとclientは通常ブロックされ、redisサービス側の処理を待機し、redisサービス側の処理が完了すると結果をclientに返します.
Client: hset a1 field value
Server: 1
Client: hset a2 field value
Server: 1
Client: hset a3 field value
Server: 1
Client: hset a4 field value
Server: 1

この送信モードでは,ネットワークオーバーヘッドの遅延,すなわちredisサーバ側が強い処理能力を有し,受信したclientメッセージが少ないためスループットが小さい.処理モードを変更することができます
Client: hset a1 field value
Client: hset a2 field value
Client: hset a3 field value
Client: hset a4 field value
Server: 1
Server: 1
Server: 1
Server: 1

pipeline方式でclientエンドコマンドを一緒に発行すると、redis serverは複数のコマンドを処理した後、結果を一緒にパッケージしてclientに返し、ネットワーク遅延のオーバーヘッドを大幅に節約します.
次にJavaのクライアントjedisでpipelineの効果をテストします.
Pipeline pipeline = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    pipeline.hset("server", "" + i, "" + i);
}
List<Object> results = pipeline.execute();
long end = System.currentTimeMillis();
System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds");

テストの結果はpipeline方式を採用し、効率はほとんどmsetと同じで、毎秒約15万のデータを挿入したが、メモリ占有量はmsetの1/3にすぎなかった.