Szczerze nie mogę zdecydować, czy jest to pytanie SO lub pytanie MSO, ale:
Przejście do innego systemu to nigdy nie jest szybsze niż wysyłanie zapytań do pamięci lokalnej (o ile jest pod kluczem); prosta odpowiedź: używamy obu! Więc używamy:
- pamięci lokalnej
- indziej Redis wyboru i zaktualizować lokalną pamięć
- inny pobrać ze źródła i zaktualizuj Redis i pamięć lokalna
To wtedy, jak mówisz, powoduje problem z unieważnieniem pamięci podręcznej - chociaż w większości miejsc to nie jest krytyczne. Ale do tego - zdarzenia redis (pub/sub) pozwalają na łatwy sposób nadawania kluczy, które zmieniają się we wszystkich węzłach, dzięki czemu mogą zrzucić swoją lokalną kopię - co oznacza: następnym razem, kiedy będzie potrzebna, wyślemy nową kopię z redis . Dlatego nadawane są nazwy kluczy, które zmieniają się pod nazwą jednego kanału zdarzeń.
Narzędzia: redis na serwerze Ubuntu; BookSleeve jako opakowanie redis; protobuf-net i GZipStream (włączane/wyłączane automatycznie w zależności od rozmiaru) dla danych opakowania.
Więc: pub Redis/sub zdarzenia są wykorzystywane do unieważnienia pamięci podręcznej dla danego klucza z jeden węzła (ten, który zna stan uległ zmianie) natychmiast (dość dużo) do wszystkich węzłów.
Odnośnie różnych procesów (z komentarzy, "czy używasz dowolnego modelu współużytkowanej pamięci dla wielu różnych procesów zasilających te same dane?"): Nie, nie robimy tego. Każda skrzynka warstwowa obsługuje tylko jeden proces (dowolnej warstwy), z wieloma dzierżawcami w ramach, więc w ramach tego samego procesu możemy mieć 70 witryn. Ze względu na starsze wersje (tj."działa i nie wymaga naprawy") używamy głównie pamięci podręcznej http z identyfikacją strony jako częścią klucza.
W przypadku kilku masywnie obciążających dane części systemu mamy mechanizmy utrzymujące się na dysku, dzięki czemu model w pamięci może być przekazywany między kolejnymi domenami aplikacji, ponieważ sieć naturalnie przetwarza (lub jest ponownie wdrażana) , ale to nie ma związku z redis.
Oto powiązanym przykładem, który pokazuje tylko, jak to może działać na szeroki smak - rozpędzają się liczbę wystąpień następujących czynności, a następnie wpisać kilka kluczowych nazwisk w:
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));
}
}
}
co należy zobacz, że po wpisaniu nazwy klucza jest ona wyświetlana natychmiast we wszystkich działających instancjach, co spowoduje zrzucenie ich lokalnej kopii tego klucza. Oczywiście w prawdziwym użyciu te dwa połączenia musiałyby być gdzieś umieszczone i pozostawione otwarte, tak by były nie w instrukcjach . Używamy do tego prawie-singletonu.
czy wydarzenie również powróci i unieważni także wersję w pamięci? Jeśli tak, ochłodzić. re: in-memory - czy używasz dowolnego modelu współużytkowanej pamięci dla wielu różnych procesów zasilających te same dane? Widzę potencjał do powielania komponentu w pamięci. – sgtz
@sgtz zmieni –
dzięki Marc. Teraz informacja na temat trawienia (jeszcze nie skończyły się kognityk myśliwski). Zarządzanie wygaśnięciem pamięci z zewnątrz jest * bardzo * miłym akcentem. Nie myślałem o tym. (!) – sgtz