Technologia i infrastruktura → Redis: rozwiązania w pamięci
Redis: rozwiązania w pamięci
1) W stosownych przypadkach Redis
Redis to szybkie przechowywanie w pamięci wartości klucza z bogatymi strukturami danych. Typowe scenariusze:- Pamięć podręczna (odczytywanie/odkładanie, TTL, SWR) i sesje.
- Liczniki i kwoty: ograniczenie stawki, zwalczanie nadużyć finansowych, limity kampanii.
- Lidery/oceny (ZSet), zalecenia "top N'.
- Kolejki zdarzeń/autobusy (strumienie/PubSub), skrzynka odbiorcza/skrzynka odbiorcza, przekaźniki.
- Idempotence (klucze z TTL), de-dup webhooks.
- Geo (szukaj najbliższych punktów), Bitmap (flagi, DAU).
- Aliasy/żetony i krótkotrwałe bufory autoryzacyjne.
2) Struktury danych i kiedy je stosować
Ciąg: wartości/liczniki ('INCRBY'), klucze idempotentne.
Hash: agregaty profili/konfiguracji, przechowywanie obiektów „lekkich”.
Lista: proste kolejki (ale bez powtórki/semantyki offsetowej).
Zestaw: unikalne elementy, deduplikacja.
ZSet: sortowanie według prędkości (lidery, kalendarz TTL - wydarzenia „odroczone”).
Strumień: stabilne kolejki z grupami konsumentów, „XREADGROUP ”/replay - dla webhooks, CDC, retras.
Geo: „GEOADD/GEORADIUS” - najbliższe punkty/handlowcy.
Bitmap/Bitfield: seria flag (loginy w dzień, DAU/WAU).
HyperLogLog: Approximate Unique (UU) jest tani w pamięci.
Bloom/Cuckoo (moduły): szybkie kontrole dostępności, zmniejszenie "MISS' do źródła.
- RedisJSON (dokumenty JSON), RediSearch (indeksowanie/wyszukiwanie), RedisBloom (struktury probabilistyczne), Na rysunkach (metryki/agregacje).
3) Klucze, TTL i zasady pamięci
Nazewnictwo i segmentacja:
tenant:{t}:domain:{d}:{entity}:{id}:v{schema} region={R} currency={C} lang={L}
Wersioning („vN”), zawiera tylko wymiary znaczące (region/waluta/język/najemca).
Odizolować przestrzenie klucza dla jednego najemcy.
- Użyj matrycy TTL (sec/min/hr), dodaj jitter (± 10-20%), aby uniknąć stampede.
- Dla kluczy gorących - odświeżanie z wyprzedzeniem i pojedynczy lot (jedna aktualizacja lidera).
- 'allkeys-lru/lfu' to wspólna pamięć podręczna bez zależności TTL.
- 'volatile-lru/lfu' - tylko klucze z TTL.
- „noeksekcja” - niepowodzenie zapisu przy przepełnieniu (bezpieczniejsze dla krytycznych kolejek/liczników).
- Wybierz dla skryptu i zawsze monitoruj 'eksmitowane _ klawisze'.
4) Transakcje, rurociągi i skrypty
Rurociągi: zmniejszyć RTT, grupa 10-100 zespołów.
Transakcje (MULTI/EXEC) - Nie izolować odczytów, ale wykonać partię atomowo.
Optymalne blokowanie: 'Klucz do oglądania' → MULTI/EXEC → sprawdź.
Skrypty Lua: logika atomowa po stronie serwera (limit szybkości, blokady, operacje złożone).
5) Kolejki i autobusy: Lista vs Stream
Lista + 'BRPOP' - proste, ale bez grup konsumenckich, offset/replay, słaba odporność na krople.
Strumień: 'XADD → XREADGROUP → XACK', retry-deadletter (nie wzięte w N minut), podział za pomocą klucza. Polecany do haków internetowych PSP/KYC, odroczonych wypłat/powiadomień.
kolejki priorytetowe: kilka strumieni według priorytetów, konsumenci „wysysają” z góry w pierwszej kolejności.
Zadania odroczone: ZSet, gdzie wynik = znacznik czasu; okresowe „ZRANGEBYSCORE” ≤ teraz → przeniesione do strumienia.
6) Wysoka dostępność i skalowalność
Replikacja: master → replika (skala odczytu).
Sentinel: automatyczny master awaryjny, discovery, URI klienta.
Klaster Redis: 16384-slot shading, pozioma skala-out. Zawijaj klucze, które używają wielu struktur w znacznikach hash '{order: 123}'.
- Dla pamięci podręcznej/sesji - klaster/replika, 'client-side hashing' obsługiwany przez SDK.
- Dla kolejek/strumieni - zminimalizuj operacje gniazda poprzecznego; partycja według klawiszy domeny.
7) Trwałość: RDB, AOF i kopie zapasowe
RDB (migawki): szybsze, bardziej ekonomiczne; ryzyko utraty ostatnich sekund/minut.
AOF (dziennik): mniej strat; tryby 'everysec/always'. Kompresja AOF i okresowe przepakowywanie.
Hybryda: RDB + AOF → szybkie odzyskiwanie + umiarkowane straty.
Kopie zapasowe: migawki i kopie AOF do przechowywania obiektów; regularnie sprawdzać odzyskiwanie.
W przypadku krytycznych kolejek/idempotencji wybierz replikację AOF 'everysec' +.
8) Bezpieczeństwo i zgodność
AUTH/ACL: role per-application, zakaz „niebezpiecznych” poleceń ('FLUSHALL', 'KEYS').
TLS do łączy klient-serwer i inter-węzeł; stałe wyjście-IP.
Segmentacja sieci: podsieci prywatne, SG/NACL; dostęp tylko z wymaganych usług/obszarów nazw.
Nie rejestruj tajemnic; PAN/PII w Redis - tylko żetony/pochodne.
Polecenia kluczowe: unikaj 'KEYS' - użyj 'SCAN'.
9) Obserwowalność i SLO
Kluczowe wskaźniki:- Latency (P95/P99), „instantaneous _ ops _ per _ sec”, „connected _ clients”.
- Współczynnik trafienia, evicted_keys, expired_keys.
- Pamięć: używana, stosunek fragmentacji, RSS, statystyki alokacji.
- Opóźnienie replikacji, częstotliwości i rozmiary AOF/RDB, czas widelca.
- Strumienie: PEL (lista oczekujących wpisów), opóźnienie dostawy, liczba ponownych prób.
- Operacje Redis P99 ≤ 5-10 ms.
- Eksmisje ≤ 1 %/godz. (przestrzeń pamięci podręcznej).
- Przesyłka strumieniowa P99 ≤ 500 м, szybkość wznowienia <2%.
10) FinOps i planowanie zasobów
Pamięć jest droga: mierz $/GB-miesiąc RAM vs zapisywanie żądań do pochodzenia/DB.
Włącz kompresję wartości> 1-2 KB (patrz procesor).
LFU może dać lepszy hit z mniejszą objętością.
Dla obrazów/dużych blobs - nie Redis: użyj pamięci CDN + obiektu.
11) Wzory dla iGaming/fintech
11. 1 Ograniczenie kursu (Lua)
Idea: 'INCRBY' w klawiszu okna + TTL; Lua atomowo sprawdza granicę i wzrasta.
lua
-- KEYS[1]=key ARGV[1]=limit ARGV[2]=ttlSec ARGV[3]=inc local cur = redis. call('INCRBY', KEYS[1], ARGV[3])
if cur == tonumber(ARGV[3]) then redis. call('EXPIRE', KEYS[1], ARGV[2]) end if cur > tonumber(ARGV[1]) then return {0, cur} else return {1, cur} end
11. 2 Żądanie idempotencji
Klucz 'idemp: {request _ id}' z TTL 24h, value - result/status. Przed wykonaniem operacji sprawdzamy obecność.
11. 3 Tablice liderów
'ZINCRBY liderboard: gra: {g} wynik użytkownika: {u}' → 'REVRANGE... WITHSCORES ".
Dla góry N według regionu/najemcy - indywidualne ZSet lub prefiksy.
11. 4 Kolejka PSP Webhooks
"XADD psp: haki internetowe... '→ grupa konsumentów' XGROUP CREATE psp: webhooks g1 $ '.
Przekładki wiadomości „utknął” za pomocą skanowania PEL ('XPENDING' → 'XCLAIM').
11. 5 Odroczone płatności
ZSet' payout: due '(wynik = epoch) → pracownik okresowo przenosi gotowe przedmioty do Stream' payout: exec 'z deduplication.
11. 6 Mierniki przeciwdrobnoustrojowe
Kombinacja 'PFADD' (niepowtarzalna) +' INCR '(intensywność) + znaczniki geo/ASN; wyzwalacze do ręcznej walidacji.
12) Praca z pamięcią i wydajnością
Puli połączeń klienta; zmniejszyć RTT (utrzymać przy życiu).
Wolą rurociągi do pakietu poleceń.
Uważaj na duże klucze ('PAMIĘĆ', 'SCAN') - lepiej jest podzielić obiekty.
Hash z małą liczbą pól jest bardziej ekonomiczne niż wiele pojedynczych kluczy.
Włącz io-nici (odczyt ciężki), jeśli zysk zostanie potwierdzony testami.
Unikać częstych „FLUSHDB/ALL” w prod; zarządzać za pomocą prefiksów i 'UNLINK' dla bezpiecznego usunięcia.
13) Wieloosobowy najemca i izolacja
Poszczególne klastry/instancje lub logiczny DB na najemcę (jeśli obciążenie jest małe).
Kontyngenty klucza/pamięci, podzielone ACL.
Przedrostki w klawiszach i metrykach według przestrzeni nazw.
14) Blokowanie i spójność
SET key val NX PX = ttl - prosty mutex.
Redlock: ostrożnie używać; w przypadku rozproszonych transakcji krytycznych lepiej jest polegać na „źródle prawdy” (DB/ledger) i operacjach idempotentnych.
Wolą operacje atomowe i Lua zamiast „długich” zamków.
15) Anty-wzory
Przechowywanie dużych blobs/obrazów - przeciążenie pamięci RAM i sieci.
Niezmienne środki finansowe (bilans) tylko w Redis.
'Klucze' i 'skanowanie świata' w prodzie.
Brak TTL/jitter - dogpile po wygaśnięciu.
Zasady „allkeys-” dotyczące krytycznych kolejek → utrata danych przy presji.
Mieszanie kolejek, pamięci podręcznej i sesji w jednym przypadku bez kwot i priorytetów.
Skryptów Lua, które działają na klawiszy różnych automatów w klastrze.
16) Lista kontrolna wdrażania
1. Zdefiniuj role: pamięć podręczna/sesje, kolejki/strumienie, liczniki/limity - post do instancji/klastrów.
2. Wybierz politykę maxmemory dla zadania; ustalanie limitów i monitorowanie eksmisji.
3. Nazewnictwo kluczy, wersje obwodów, matryca TTL + jitter; pojedynczy lot dla najlepszych kluczy.
4. Dla kolejek - Strumienie (grupy, przekładki, DLQ), dla odroczonego - ZSet + transfer.
5. HA: replikacja + klaster Sentinel lub Redis; sprawdź awarię klienta.
6. Trwałość: RDB/AOF w skrypcie; regularne kopie zapasowe i test odzyskiwania.
7. Bezpieczeństwo: ACL, TLS, prywatne sieci, zakaz niebezpiecznych poleceń.
8. Obserwowalność: opóźnienie, ops/sec, pamięć, eksmisje, opóźnienie replikacji, strumień PEL.
9. FinOps: profile pamięci, duże klawisze, kompresja, LFU; unikać Redis dla dużych blobs.
10. Dokumentacja wzoru (ograniczenie szybkości, iempotencja, tablice liderów) i badania obciążenia.
Wynik
Redis jest „wielofunkcyjnym szwajcarskim nożem” prędkości: pamięci podręcznej, kolejek, liczników, tablic liderów, struktur geo i probabilistycznych. Jego siła polega na prawidłowym wyborze struktur danych, dyscypliny TTL/niepełnosprawności, atomicity operacji oraz przemyślanej trwałości i trwałości HA. Użyj Redis, gdzie milisekundy i wysoki RPS są ważne, pozostawiając niezmienne krytyczne (pieniądze, księgowość) do „źródła prawdy” - w ten sposób platforma pozostanie zarówno szybki i niezawodny.