1

このリストが、redis クライアント "hiredis" について質問するのに適していることを願っています。以下で行っているのと同じことを redis client で実現したいと考えています。ご覧のとおり、redis は 1 回の rpush 呼び出しで 3 つの異なるレコードを送信します。

redis 127.0.0.1:6379> rpush test kemal erdem husyin

(integer) 3
redis 127.0.0.1:6379> lrange test 0 -1
1) "kemal"
2) "erdem"
3) "husyin"

私のプロジェクトでは、例としてhiredisを使用します:

reply =  (redisReply*)(redisCommand(c, "RPUSH %s %s" , channelName,  message));

しかし今、私はすべての行が次のようなバフに保持されている大きなログファイルを持っていますchar[][]; 各行を異なるレコードとして送信する必要がありますが、パフォーマンスのために rpush を 1 回だけ呼び出す必要があります。アドバイスはありますか?

4

1 に答える 1

2

数千を超えるアイテムをプッシュするために独自のコマンドを送信するのは悪い考えです。通信バッファーが飽和状態になり、Redis のシングルスレッドの性質により、大きなコマンドは他のすべての同時コマンドをブロックします。

n 個のアイテム (n は 10 から 100 の間) の小さなパケットのバッチでプッシュ コマンドを作成し、m 個のコマンド (m は 10 から 100 の間)のパイプラインでプッシュ コマンドをグループ化することをお勧めします。

アルゴリズムは次のようになります。

While there are still lines to read:
   New Redis pipeline, i=0
   While there are still lines to read and i<m:
      Read at most n lines
      Build push command for the read lines
      Pipeline push command
      ++i
   Flush Redis pipeline, check return status if needed

N / (n*m) 回の往復 (N は入力ファイルの行数) のみを生成します。

任意の数のパラメーターを持つコマンドを作成するには、redisAppendCommandArgv関数を使用できます。

于 2013-10-01T10:35:30.150 に答える