Pamięć podręczna Redis a bezpośrednie używanie pamięci

141

Nie korzystałem jeszcze z Redis, ale słyszałem o tym i planuję wypróbować go jako pamięć podręczną.

Słyszałem, że Redis używa pamięci jako bazy danych magazynu pamięci podręcznej, więc jaka jest różnica, jeśli używam zmiennej jako typu danych obiektu lub słownika do przechowywania danych? lubić:

var cache = {
    key: {

    },
    key: {

    }
    ...
}

Jaka jest zaleta Redis?

hh54188
źródło

Odpowiedzi:

221

Redis to zdalny serwer struktury danych. Jest to z pewnością wolniejsze niż zwykłe przechowywanie danych w pamięci lokalnej (ponieważ pobieranie / przechowywanie danych wymaga wymiany danych przez gniazdo). Jednak ma również kilka interesujących właściwości:

  • Dostęp do Redis mogą mieć wszystkie procesy aplikacji, prawdopodobnie działające na kilku węzłach (coś, czego pamięć lokalna nie może osiągnąć).

  • Magazyn pamięci Redis jest dość wydajny i wykonywany w osobnym procesie. Jeśli aplikacja działa na platformie, której pamięć jest bezużyteczna (node.js, java itp.), Umożliwia obsługę znacznie większej pamięci podręcznej / magazynu. W praktyce bardzo duże sterty nie działają dobrze z językami ze śmieciami.

  • W razie potrzeby Redis może utrwalić dane na dysku.

  • Redis to coś więcej niż zwykła pamięć podręczna: zapewnia różne struktury danych, różne zasady eksmisji przedmiotów, kolejki blokujące, pub / sub, atomowość, skrypty Lua itp.

  • Redis może powielać swoją aktywność za pomocą mechanizmu master / slave w celu zaimplementowania wysokiej dostępności.

Zasadniczo, jeśli potrzebujesz skalować aplikację na kilka węzłów udostępniających te same dane, wymagane będzie coś takiego jak Redis (lub inny zdalny magazyn kluczy / wartości).

Didier Spezia
źródło
5
Twoja ostatnia uwaga szczególnie sprawia, że ​​wydaje się, że rzeczy takie jak Rlite są trochę bezcelowe - sklep ze słownikami byłby równie odpowiedni w większości przypadków użycia, w których masz jeden proces. Czy to prawda?
naught101
1
Tak. IMO zainteresowanie Rlite jest dość ograniczone.
Didier Spezia,
dzięki za te wskazówki, więc Redis jest świetny do skalowania, ale zakładam, że w przypadku prostej aplikacji czatu ze średnio 300-500 obiektami do pobrania w pamięci, struktura danych w pamięci wykona zadanie bardzo dobrze, jeśli nie szybciej, ponieważ to są małe?
Webwoman
2
@DidierSpezia very large heaps do not perform well with garbage collected languagesczy możesz wyjaśnić dlaczego?
roottraveller
1
@roottraveller, wydaje mi się, że dzieje się tak, ponieważ proces czyszczenia pamięci generalnie musi przerwać wykonywanie Twojej aplikacji („stop-the-world”), aby zwolnić pamięć sterty, a im większy sterta, tym zwykle ta przerwa trwa.
Regorsmitz
3

Obecnie bardziej pociąga nas architektura bez serwerów, w której każde żądanie może trafić do innego kontenera, w tym przypadku redis może odgrywać bardzo ważną rolę.

Nie możemy używać zwykłej pamięci podręcznej na serwerze, ponieważ nie możemy być pewni, że nasze żądanie zostanie obsłużone w tym samym kontenerze, w którym jest przechowywana nasza prosta pamięć podręczna.

W tym przypadku musimy użyć redis, ponieważ przechowuje pamięć podręczną w zdalnej lokalizacji i możemy uzyskać dostęp do zmian nawet kontenerów w architekturze bez serwera.

Ashish Bainade
źródło