正直なところ、これがSOの質問なのかMSOの質問なのかはわかりませんが、
別のシステムに移行することは決してありません ローカルメモリをクエリするよりも高速です(キーが設定されている限り)。簡単な答え:両方を使用します!したがって、次を使用します:
- ローカルメモリ
- それ以外の場合は、redisを確認し、ローカルメモリを更新します
- それ以外の場合はソースからフェッチし、redisとローカルメモリを更新します
これは、あなたが言うように、キャッシュの無効化の問題を引き起こします-実際にはそれは重要ではありませんが ほとんどの場所で。ただし、この場合-redisイベント(pub / sub)を使用すると、すべてのノードに変更されているキーを簡単にブロードキャストできるため、ローカルコピーをドロップできます-つまり、次に必要になったときに、redisから新しいコピーを取得します。したがって、単一のイベントチャネル名に対して変更されるキー名をブロードキャストします。
ツール:ubuntuサーバーでredis; redisラッパーとしてのBookSleeve。データをパッケージ化するためのprotobuf-netおよびGZipStream(サイズに応じて自動的に有効/無効)。
つまり、redis pub / subイベントは、1つの特定のキーのキャッシュを無効にするために使用されます。 ノード(状態が変化したことを知っているノード)はすぐに(ほぼ)すべてになります ノード。
個別のプロセスについて(コメントから、「同じデータをフィードする複数の個別のプロセスに何らかの共有メモリモデルを使用していますか?」):いいえ、それは行いません。各ウェブ層ボックスは、実際には(任意の層の)1つのプロセスのみをホストしており、マルチテナンシーは内 つまり、同じプロセス内に70のサイトがある可能性があります。従来の理由(つまり、「機能し、修正する必要はない」)のために、主に、キーの一部としてサイトIDを使用してhttpキャッシュを使用します。
システムのデータ集約型のいくつかの部分では、ディスクに永続化するメカニズムがあり、Webが自然にリサイクル(または再デプロイ)されるときにメモリ内モデルを連続するアプリドメイン間で受け渡すことができますが、それはredisとは無関係です。
これは、幅広いフレーバーのみを示す関連する例です。 これがどのように機能するかを説明します-次のインスタンスをいくつかスピンアップしてから、いくつかのキー名を入力します:
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
ステートメント。これにはほぼシングルトンを使用します。