Sejujurnya saya tidak bisa memutuskan apakah ini pertanyaan SO atau MSO, tapi:
Pergi ke sistem lain tidak pernah lebih cepat daripada meminta memori lokal (selama itu dikunci); jawaban sederhana:kami menggunakan keduanya! Jadi kami menggunakan:
- memori lokal
- jika tidak, periksa redis, dan perbarui memori lokal
- lain ambil dari sumber, dan perbarui redis dan memori lokal
Ini kemudian, seperti yang Anda katakan, menyebabkan masalah pembatalan cache - meskipun sebenarnya itu tidak kritis di sebagian besar tempat. Tetapi untuk ini - acara redis (pub/sub) memungkinkan cara mudah untuk menyiarkan kunci yang berubah ke semua node, sehingga mereka dapat menghapus salinan lokalnya - artinya:lain kali diperlukan, kami akan mengambil salinan baru dari redis . Oleh karena itu, kami menyiarkan nama-nama kunci yang berubah terhadap satu nama saluran acara.
Alat:redis di server ubuntu; BookSleeve sebagai pembungkus redis; protobuf-net dan GZipStream (diaktifkan/dinonaktifkan secara otomatis tergantung ukuran) untuk mengemas data.
Jadi:peristiwa redis pub/sub digunakan untuk membatalkan cache untuk kunci tertentu dari satu node (yang mengetahui status telah berubah) segera (cukup banyak) menjadi semua node.
Mengenai proses yang berbeda (dari komentar, "apakah Anda menggunakan model memori bersama apa pun untuk beberapa proses berbeda yang memberi makan data yang sama?"):tidak, kami tidak melakukan itu. Setiap kotak tingkat web hanya benar-benar menampung satu proses (dari tingkat mana pun), dengan multi-penyewaan dalam itu, jadi dalam proses yang sama kita mungkin memiliki 70 situs. Untuk alasan warisan (yaitu "berfungsi dan tidak perlu diperbaiki") kami terutama menggunakan cache http dengan identitas situs sebagai bagian dari kunci.
Untuk beberapa bagian sistem yang intensif data secara besar-besaran, kami memiliki mekanisme untuk bertahan ke disk sehingga model dalam memori dapat diteruskan di antara domain aplikasi yang berurutan saat web secara alami mendaur ulang (atau di-deploy ulang), tetapi itu tidak terkait dengan redis.
Berikut adalah contoh terkait yang menunjukkan hanya rasa yang luas tentang cara kerjanya - putar beberapa contoh berikut, lalu ketik beberapa nama kunci di:
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));
}
}
}
Apa yang harus Anda lihat adalah ketika Anda mengetikkan nama kunci, nama kunci tersebut langsung ditampilkan di semua instance yang sedang berjalan, yang kemudian akan membuang salinan lokal kunci tersebut. Jelas dalam penggunaan nyata, dua koneksi perlu diletakkan di suatu tempat dan tetap terbuka, jadi tidak berada di using
pernyataan. Kami menggunakan hampir satu orang untuk ini.