分単位でhincrby
のキーに格納された値に対して何百万もの演算を実行していて同時にその値を表示すると、私は認識する必要がある競合条件の?さらに、hincrby
コマンドは、スケールアップすると自動的にキューに入れられますか?グローバルカウンタをredisに維持する際の短所
基本的には、アプリで非常に頻繁に発生するイベント(1秒あたり何百ものイベントが発生し、毎秒何百もの設定と取得コマンドにつながる)のグローバルカウンタを設定して取得したいと考えています。
分単位でhincrby
のキーに格納された値に対して何百万もの演算を実行していて同時にその値を表示すると、私は認識する必要がある競合条件の?さらに、hincrby
コマンドは、スケールアップすると自動的にキューに入れられますか?グローバルカウンタをredisに維持する際の短所
基本的には、アプリで非常に頻繁に発生するイベント(1秒あたり何百ものイベントが発生し、毎秒何百もの設定と取得コマンドにつながる)のグローバルカウンタを設定して取得したいと考えています。
レディスコマンドはアトミックに実行され、NO競合状態があります。
レディスは非常に高速で、1秒あたり何千もの高速操作(たとえば、HINCRBY
)が必要です。だから私はあなたのシナリオでは(毎秒何百もの操作)、パフォーマンスについて心配する必要はないと思います。また、ベンチマークテストをしないでください。
トラフィックが高いときにRedisサーバーをスラッシングさせないようにするには、Redisに書き込むレートをアプリに制限する方法もあります。アプリケーションサーバーは独自の内部カウンタを保持し、既知の間隔(10秒ごとなど)でレディスに合計を保存することができます。
私が何を意味するかの簡単なコード例:
var mycounter = 0;
// maintain internal counter
var increment = function() {
mycounter++;
};
// only write to Redis once every ten seconds
setInterval(function() {
var val = mycounter;
if (val > 0) {
mycounter = 0;
redisclient.hincrby("mykey", "counter", val);
}
}, 10000);
ありRedisのを達することはありませんカウントへのリスクはあるが、少なくともRedisの書き込み速度は、既知の量です。
すべてのベンチマークを行います。私の唯一の悩みは、私がここで 'パイプライン'を使うことができないということでした。トラフィックが高いときに私はRedisサーバーを悩ますでしょう。 –
@HassanBaig一貫性があまり重要でない場合は、Redisの奴隷からスケールアウトすることを検討することができます –