永続的な最適化のRedisのソースを読む - パイプライン

永続的な製造のRedis(理解されるAOFまたはRDBが、これは後述するが、ディスクにメモリ内のデータを同期するには、2つの異なる方法である)開始が直接フォーク子プロセス外である場合、その後、子供を聞かせプロセス、親プロセスがまだ動作している間に、仕事への永続化のために取るサービスを提供し、コマンドもキャッシュされている受信、タスクを実行し、その後、子プロセス、親、親プロセスの収穫に同期キャッシュされたコマンドを通知しますディスク、そして最終的にOK。しかし、これは問題になり、キャッシュ内の親プロセスデータが多すぎて、パフォーマンスの低下の原因となります場合には、タスクを実行するために子プロセスの間に、ある、Redisの大物は、親と子の間の通信にパイプを使用する方法を考え出します親プロセスの間、コマンドの子供を最適化するためには、ディスクに書き込まれたデータの数を、プロセスの実行がパイプラインを介して子供に宛て、その親プロセスが収穫の子プロセスが終了した後に減少させることができる受け取ります。
以下を達成するための単純なパイプRedisの中:

  1. 開きます。

折りたたまれたまたは展開(こちら)をクリックします

空openChildInfoPipe(無効){
場合(パイプ(server.child_info_pipe)== -1){
/ *エラーの我々の2つのファイル記述子がまだ-1に設定する必要があり、

  • しかし、我々は傷つけることができないので、とにかくcloesChildInfoPipe()を呼び出します。* /
    closeChildInfoPipe();
    }そうであれば(anetNonBlock(NULL、server.child_info_pipe [0])= ANET_OK!){
    closeChildInfoPipe()。
    } {他
    のmemset(&server.child_info_data、0、はsizeof(server.child_info_data))。
    }
    }
    1. 閉じる:鄭州不妊病院×××:http://www.zzchyy110.com//

折りたたまれたまたは展開(こちら)をクリックします

/ )(openChildInfoPipeで開かれたパイプを閉じます。/
空隙closeChildInfoPipe(ボイド){
IF(server.child_info_pipe [0] = -1 ||!
server.child_info_pipe [1] = -1!)
{
近い(server.child_info_pipe [0])。
閉じる(server.child_info_pipe [1])。
server.child_info_pipe [0] = -1。
server.child_info_pipe [1] = -1。
}
}

  1. 親にデータを送信します

折りたたまれたまたは展開(こちら)をクリックします

/ *親にCOWデータを送信します。子供が移入した後に、この関数を呼び出す必要があります

  • 対応するフィールドは、それが(プロセス・タイプに応じて)が送信したいです。/
    空隙sendChildInfo(int型のp型){
    IF(server.child_info_pipe [1] == -1)のリターン;
    server.child_info_data.magic = CHILD_INFO_MAGIC。
    server.child_info_data.process_type = p型;
    ssize_tのWLEN =はsizeof(server.child_info_data)。
    IF(ライト(server.child_info_pipe [1]、&server.child_info_data、WLEN)!= WLEN){
    /
    エラー時には何の関係もない、これは他の側で検出されます。* /
    }
    }
    1. 親データ受信

折りたたまれたまたは展開(こちら)をクリックします

/ 親からCOWデータを受信します。/
空隙receiveChildInfo(ボイド){
IF(server.child_info_pipe [0] == -1)のリターン;
ssize_tのWLEN =はsizeof(server.child_info_data)。
(読み取り(server.child_info_pipe [0]、&server.child_info_data、WLEN)== WLEN &&場合
server.child_info_data.magic == CHILD_INFO_MAGIC)
{
IF(server.child_info_data.process_type == CHILD_INFO_TYPE_RDB){
server.stat_rdb_cow_bytes = server.child_info_data .cow_size;
}そうであれば(server.child_info_data.process_type == CHILD_INFO_TYPE_AOF){
server.stat_aof_cow_bytes = server.child_info_data.cow_size。
}
}
}

おすすめ

転載: blog.51cto.com/14339038/2402806