が、これがあれば、私は正直に決めることができませんSO質問またはMSO質問:
別のシステムに行くのは、ではありません。は、ローカルメモリを照会するよりも速く(キー入力されている限り)。簡単な答え:我々は両方を使用する!だから、私たちが使用します。
- ローカルメモリ
- 他にチェックRedisのを、ローカルメモリ
- を更新し、他のソースからのフェッチ、および更新Redisのローカルメモリ
、その後
これを、あなたが言うように、実際にはクリティカルではありませんが、キャッシュ無効化の問題が発生します。しかし、このために - redisイベント(pub/sub)は、すべてのノードに変更されているキーを簡単にブロードキャストすることができるので、ローカルコピーをドロップすることができます - 次回は、 。したがって、変更しているキー名は、単一のイベント・チャネル名に対してブロードキャストします。
ツール:ubuntu serverでredis;レディスラッパーとしてのBookSleeve; protobuf-net、GZipStream(サイズに応じて自動的に有効/無効)を設定します。
ので:Redisのパブ/サブイベントがすべてのノードにノード(状態を知っている1が変更された)すぐに(ほとんど)から指定されたキーのキャッシュを無効にするために使用されています。
異なるプロセスについて(コメントから、「複数の異なるプロセスに同じデータを供給するための共有メモリモデルを使用していますか?」):いいえ、それはしません。各Web層ボックスは実際には1つのプロセス(任意の階層の)をホストしており、マルチテナントがにあるため、同じプロセス内に70のサイトがある可能性があります。従来の理由(すなわち、"それは動作し、修正する必要はありません")、私たちは主にサイトIDを持つhttpキャッシュをキーの一部として使用します。
大量のデータ集約型のシステムでは、ディスクに永続化するメカニズムを備えているため、ウェブが自然にリサイクル(または再配置)されると、メモリ内モデルを連続したアプリケーションドメイン間で受け渡すことができます。それは赤みとは無関係です。ここで
は、これはうまくいくかもしれない方法の
幅広い味を示し、関連する例を示します - 以下のインスタンスの数をスピンアップし、その後にいくつかのキー名を入力します。 static class Program
{
static void Main()
{
const string channelInvalidate = "cache/invalidate";
using(var pub = new RedisConnection("127.0.0.1"))
using(var sub = new RedisSubscriberConnection("127.0.0.1"))
{
pub.Open();
sub.Open();
sub.Subscribe(channelInvalidate, (channel, data) =>
{
string key = Encoding.UTF8.GetString(data);
Console.WriteLine("Invalidated {0}", key);
});
Console.WriteLine(
"Enter a key to invalidate, or an empty line to exit");
string line;
do
{
line = Console.ReadLine();
if(!string.IsNullOrEmpty(line))
{
pub.Publish(channelInvalidate, line);
}
} while (!string.IsNullOrEmpty(line));
}
}
}
あなたは何をすべきキー名を入力すると、実行中のすべてのインスタンスにすぐに表示され、そのキーのローカルコピーがダンプされます。明らかに実際の使用では、2つの接続をどこかに置いて開いておく必要があるので、ではなく、はusing
となります。これにはほぼシングルトンを使います。
このイベントはまた戻ってメモリ内のバージョンを無効にしますか?もしそうなら、クール。 re:in-memory - 複数の異なるプロセスに同じデータを供給するために、あらゆる種類の共有メモリモデルを使用していますか?メモリ内のコンポーネントが重複する可能性があります。 – sgtz
@sgtzは編集します –
Marcに感謝します。今、情報を消化しています(精神的な歯はまだ終わっていません)。メモリからの有効期限を外部から管理することは、とても素晴らしいことです。それを考えなかった。 (!) – sgtz