このリストが、redisクライアント「hiredis」について質問するのに適していることを願っています。以下のredisクライアントで行っているのと同じことを実現したいと思います。ご覧のとおり、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回だけ呼び出す必要もあります。アドバイスはありますか?
数千を超えるアイテムをプッシュするための一意のコマンドを送信することはお勧めできません。これは通信バッファを飽和させ、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関数を使用できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加