Zasadniczo pamięć podręczna jest komponentem oprogramowania lub sprzętowym, który przechowuje dane z dawnych żądań klienta, dzięki czemu dane można pobrać i serwować szybciej dla żądań składanych w przyszłości. W większości przypadków systemy zaplecza nie są tak szybkie, jak chcesz. Pamięć podręczna znajduje się między warstwą bazy bazy danych a aplikacją klienta, zapewniając szybkie wyszukiwanie danych i szybki czas odpowiedzi.
Gdy żądane dane są dostępne w pamięci podręcznej Redis, dane mogą być bezpośrednio obsługiwane z pamięci podręcznej Redis bez przekierowania żądania do podstawowej bazy danych, która nazywa się uderzeniem pamięci podręcznej. Z drugiej strony, jeśli dane nie są dostępne w pamięci podręcznej Redis, żądanie musi dotrzeć do oryginalnej bazy danych zaplecza, aby pobrać dane jak zwykle, co jest misją pamięci podręcznej, ale kolejne żądania będą serwować z pamięci podręcznej.
Z tego rodzaju zachowaniem buforowanie Redis jest doskonałym wyborem dla wielu przypadków użycia.
Budy pamięci Redis przynoszą Twoją aplikację kilka korzyści, wprowadzając jedno główne wyzwanie, które nazywa się Silność pamięci podręcznej. W pewnym momencie Twoja pamięć podręczna może być pełna przestarzałych danych, które nawet nie są ważne na dziś. Dlatego powinien istnieć mechanizm eksmisji starych lub nieprawidłowych danych, gdy nadal używasz pamięci podręcznej Redis z nowymi danymi.
Eksmisja pamięci podręcznej Redis
Kiedy po raz pierwszy wprowadzono pamięć podręczną Redis, programiści używali wartości TTL (czas do życia) dla każdego klucza do utrzymania względnie stałej ilości pamięci poprzez dopasowanie prędkości danych wchodzących i wychodzących z systemu. To było dużo pracy ręcznej dla programistów, co powinien obsługiwać serwer Redis.
Dlatego idealnym podejściem powinno być automatyczne wydalenie starych danych w miarę osiągnięcia maksymalnego limitu pamięci pamięci podręcznej, która jest również procesem, po którym następuje system memcached. Redis używa specjalnego Maxmemory dyrektywa w celu powiadomienia o maksymalnym limicie pamięci.
Dyrektywa konfiguracji MaxMemory
Redis używa dyrektywy konfiguracji MaxMemory, aby zidentyfikować maksymalną dostępną pamięć dla pamięci podręcznej. Istnieją dwa sposoby ustawienia wartości dyrektywy MaxMemory.
Poniżej znajduje się przykład redis.plik CONF, który pokazuje, w jaki sposób możesz określić maksymalną pamięć pamięci podręcznej dla zestawu danych. W tym przypadku dyrektywa MaxMemory została ustawiona na 1000 bajtów.
Podobnie, polecenie zestawu konfiguracji Redis może być używane do ustawienia dyrektywy MaxMemory w czasie wykonywania, jak pokazano następujące.
Zestaw konfiguracji MaxMemory 100
Ponadto, jeśli ustawisz wartość dyrektywy MaxMemory na 0, oznacza to, że nie określono limitu pamięci dla pamięci podręcznej Redis. W większości 64-bitowych systemów ta wartość jest ustawiona na 0. 32-bitowy system wykorzystuje maksymalny limit pamięci 3 GB.
Gdy pamięć podręczna Redis trafia w wartość pamięci określoną w dyrektywie MaxMemory, zaczyna usuwać klucze zgodnie z wybraną zasadą eksmisji. Jeśli żaden klucz spełnia kryteria polityki, nic nie zostanie eksmitowane. Zamiast tego serwer Redis odpowie na błędy na polecenia takie jak LPUSH i SET, które zużywają więcej pamięci i odpowiada tylko na polecenia tylko do odczytu, takie jak Get.
W poniższej sekcji omówimy politykę eksmisji Redis i sposób, w jaki określają, które klucze powinny być eksmitowane, czy nie.
Polityka eksmisji
Polityka eksmisji określa zachowanie pamięci podręcznej Redis, gdy osiągnięto wartość maksymalną. Redis usunie wszystkie klucze, które spełniają dane kryteria polityki w danym momencie. Dlatego ważne jest, aby upewnić się, że masz wystarczająco dużą bazę danych, aby zachować pożądane klucze. Poniższe sekcje opisują różne zasady eksmisji Redis dostępne do użycia.
NoeViction
Dostępnych jest kilka zasad eksmisji i NoeViction jest jednym z najczęściej używanych, jeśli nie chcesz usunąć żadnych starych kluczy, gdy osiągnięto maksymalny limit pamięci. Jednak będzie to spowodować błędy we wszystkich operacjach zapisu Redis, aby powiadomić użytkownika, że pamięć podręczna jest pełna i uwolnić trochę miejsca. Krótko mówiąc, dane nie zostaną zapisane na pamięci podręcznej, dopóki nie zwolnisz miejsca ręcznie.
lotny ttl
w lotny ttl Polityka, Redis pobiera próbki kluczy, których pola wygasające są ustawione na prawdziwe i eksmitują te o najmniejszej wartości TTL. Jeśli nie ma kluczy z polem wygasającym ustawionym na true, to nie zdarzy się eksmisji, co jest podobne do NoeViction polityka.
lotny Random
To kolejna wersja zasady lotnej TTL, w której Redis losowo usuwa klawisze, którego pole wygaśnięcia jest ustawione na true. Znowu rozważa tylko klawisze, które mają wartość TTL, ale nie całą przestrzeń.
Allkeys-Random
Jest to bardziej podobne do lotny Random polityka, ale z Allkeys-Random Polityka, zostanie rozważona całe kluczowe miejsce, nie tylko klucze o wartości TTL. W takim przypadku Redis wyświetli klucze losowo, aby dodać nowe dane.
Obie powyższe zasady wykorzystują losowy algorytm do eksmisji kluczy z pamięci podręcznej, co jest dość ryzykowne i może nie być optymalnym sposobem na wykonywanie kluczowej eksmisji. Tak więc Redis wprowadził bardziej optymalny sposób na zrobienie tego z nowym LRU (najnowszy niedawno używany) algorytm.
Algorytm LRU (najnowszy niedawno)
Algorytm LRU opiera się na założeniu, że jeśli niedawno uzyskano dostęp do danego klucza, istnieje większe prawdopodobieństwo ponownego dostępu do niego w najbliższej przyszłości. Z drugiej strony, jeśli nie używaliśmy danego klucza przez długi czas, istnieje większa szansa, że klucz nie zostanie użyty wkrótce lub nigdy więcej. Przy takim założeniu algorytm LRU próbuje eksmitować najdroższy niedawno używany klucze z pamięci podręcznej Redis, co jest bardziej optymalnym podejściem niż losowe algorytmy eksmisji.
Aby wdrożyć tę politykę, obiekt Redis używa nowego Lru pole z 24 bitami, które śledzi, gdy klucz był ostatnio używany. Z algorytmem LRU wymaga określonej liczby losowych kluczy i eksmituje ten z najwyższym czasem bezczynności lub najstarszym czasem dostępu. Dyrektywa MaxMemory-Samples służy do określenia liczby kluczy na próbkę. Można to ustawić za pomocą polecenia konfiguracyjnego, jak pokazano następująco.
Zestaw konfiguracji MaxMemory-Samples 5
Ważne jest, aby pamiętać, że Redis prowadzi przybliżenie algorytmu LRU, aby uprościć i oszczędzać zasoby obliczeniowe, takie jak procesor i pamięć.
Istnieją dwa smaki polityki eksmisji LRU.
lotny Lru
Najstarsznie używane klawisze z polem wygasającego do true zostaną usunięte. Klucze, które nie są powiązane z wartością TTL, nie będą eksmitowane w ramach tej polityki, ponieważ próbka jest pobierana tylko z kluczy, których pole wygaśnięcia jest ustawione na prawdziwe.
Allkeys-lru
Wszystkie klucze o najwyższym czasie bezczynności zostaną usunięte. W takim przypadku Redis będzie przechowywał ostatnio używane klucze.
Algorytm LFU (najmniej często używany)
Redis wprowadził nowy algorytm LFU (najmniej często używany) w wersji 4.0 Aby zidentyfikować rzadko używane klawisze i usunąć je z pamięci podręcznej po osiągnięciu maksymalnego limitu pamięci. Dzięki zasadom LFU klucze, do których dostępny jest zbyt często, pozostaną.
lotny LFU
Klucze z pól wyginających ustawione na true, a te, które są najmniej często używane wśród wybranej próbki, zostaną eksmitowane.
Allkeys-lfu
Szuka całej przestrzeni kluczowej w przypadku rzadko używanych klawiszy i usuwa je, zachowując często używane klawisze.
Wniosek
Podsumowując, Redis używa dyrektywy MaxMemory, aby określić maksymalny limit pamięci pamięci podręcznej Redis. Jak omówiono, gdy pamięć podręczna osiągnie maksymalny limit pamięci, skonfigurowana zasady eksmisji wystrzeli i usunie klucze. Redis wykorzystuje przybliżenia algorytmów LRU i LFU, aby znaleźć najlepszych kandydatów do eksmisji.