redisが過負荷になった場合、setリクエストをドロップするように設定できますか?多数のアイテムのデータをリアルタイムで(アイテムごとに1秒間に10〜15回)更新するアプリケーションがあります。値はすぐに古くなり、一貫性は必要ありません。
また、リアルタイムで書き込まれる値の並列合計を計算したいと思います。ここで最良のオプションは何ですか?LUAはredisで実行されましたか?UNIXソケットを使用するredisと同じボックスにある小さなアプリ?
redisが過負荷になった場合、setリクエストをドロップするように設定できますか?多数のアイテムのデータをリアルタイムで(アイテムごとに1秒間に10〜15回)更新するアプリケーションがあります。値はすぐに古くなり、一貫性は必要ありません。
また、リアルタイムで書き込まれる値の並列合計を計算したいと思います。ここで最良のオプションは何ですか?LUAはredisで実行されましたか?UNIXソケットを使用するredisと同じボックスにある小さなアプリ?
Redisが過負荷になると、クライアントの速度が低下します。ほとんどのコマンドでは、プロトコル自体は同期しています。
Redisはパイプラインをサポートしていますが、クライアントがパイプライン内のトラフィックをキャンセルする方法はありませんが、サーバーによってまだ確認されていません。Redis自体は実際には着信トラフィックをキューに入れませんが、TCPスタックがキューに入れます。
そのため、セットリクエストをドロップするようにRedisサーバーを設定することはできません。ただし、クライアント側で最後の値のキューを実装することは可能です。
キューは、実際には、アイテムによってインデックス付けされた2つのマップで表されます(アイテムごとに1つの値のみが格納されます)。プライマリマップは、アプリケーションによって使用されます。セカンダリマップは特定のスレッドによって使用されます。2つのマップのコンテンツは、アトミックな方法で交換できます。
プライマリマップが空の場合、特定のスレッドがブロックされています。そうでない場合は、2つのマップのコンテンツを交換し、積極的なパイプライン処理と可変個引数パラメーターコマンドを使用して、セカンダリマップのコンテンツを非同期でRedisに送信します。また、Redisからackを受け取ります。
スレッドがセカンダリマップを処理している間、アプリケーションはプライマリマップを埋めることができます。Redisが遅すぎる場合、アプリケーションはプライマリマップの最後の値のみを蓄積します。
この戦略は、hiredisと選択したイベントループを使用してCで実装できます。
ただし、実装するのは簡単ではないので、最初に、すべてのトラフィックに対するRedisのパフォーマンスが私の目的にとって十分でないかどうかを確認します。最近では、Redisを500K op / s以上でベンチマークすることも珍しくありません(シングルコアを使用)。必要に応じて、複数のRedisインスタンスでデータをシャーディングすることを妨げるものは何もありません。
RedisサーバーのCPUの前にネットワークリンクが飽和状態になる可能性があります。そのため、サーバー側ではなくクライアント側で最後の値キュー(必要な場合)を実装する方が適切です。
合計の計算については、リアルタイムで計算して維持しようと思います。たとえば、GETSETコマンドを使用して、前の値を返しながら新しい値を設定できます。
値を設定するだけでなく、次のことができます。
[old value] = GETSET item <new value>
INCRBY mysum [new value] - [old value]
mysumキーには、いつでもすべてのアイテムの値の合計が含まれます。Redis 2.6では、Luaを使用してこの計算を妨害し、ラウンドトリップを節約できます。
大きなバッチを実行して既存のデータの統計を計算する(これがあなたの「並列」合計を理解する方法です)は、Redisにはあまり適していません。map/reduceのような計算用には設計されていません。