Cache

Mechanizm tymczasowego przechowywania danych, by szybciej je udostępniać przy kolejnych żądaniach. Skraca czas ładowania stron i odciąża serwer.

Cache (pamięć podręczna) to mechanizm tymczasowego przechowywania danych w miejscu, z którego można je odczytać szybciej niż ze źródła. Idea jest prosta: jeśli coś było kosztowne do policzenia, pobrania albo wczytania, a będziesz tego potrzebować ponownie — zapisz wynik gdzieś bliżej i następnym razem sięgnij po gotowca, zamiast robić całą robotę od nowa.

Jak to działa

Cache działa na zasadzie pytania: „czy mam to już zapisane?”. Jeśli dane są w cache, masz cache hit — odpowiedź wraca błyskawicznie. Jeśli ich nie ma, jest cache miss — system idzie do wolniejszego źródła (bazy danych, dysku, zewnętrznego API), pobiera dane, oddaje ci je i zwykle przy okazji zapisuje w cache na przyszłość. Pamięć podręczna jest celowo mała i szybka, więc nie zmieści wszystkiego — dlatego ma reguły eviction (np. LRU, czyli usuwanie tego, co najdawniej używane) i TTL (time to live), po którym wpis się przeterminowuje.

Cache spotkasz na każdym poziomie: cache CPU (L1/L2/L3), cache dysku, cache przeglądarki, cache DNS, cache zapytań do bazy czy CDN trzymające pliki bliżej użytkownika. Wszystkie robią to samo — skracają drogę do danych.

Przykład z praktyki

Klasyk to Redis jako cache przed bazą danych. Twoja aplikacja, zanim odpyta wolnego PostgreSQL, najpierw sprawdza Redis. Wzorzec cache-aside w pseudokodzie wygląda tak: GET user:42 z Redisa — jeśli pusto, pobierasz z bazy i robisz SET user:42 {...} EX 300, czyli zapisujesz na 300 sekund. Kolejne requesty o tego użytkownika lecą prosto z pamięci i baza ma spokój.

Po stronie frontu zadziała nagłówek HTTP Cache-Control: max-age=3600 na statycznych plikach — przeglądarka trzyma je lokalnie przez godzinę i nie pobiera CSS-a przy każdym przeładowaniu.

Częste błędy i pułapki

Najgorszy scenariusz to stale cache — użytkownik widzi stare dane, bo zapomniałeś unieważnić wpis po zmianie. Stąd słynny żart Phila Karltona: w informatyce są tylko dwie trudne rzeczy — unieważnianie cache i nazywanie zmiennych. Uważaj też na cache stampede: gdy popularny wpis wygaśnie, setki requestów naraz walą do bazy. I pamiętaj — cache to optymalizacja, nie źródło prawdy. Nigdy nie trzymaj tam czegoś, czego nie da się odtworzyć ze źródła.

Pojęcia powiązane

TTL, cache invalidation, cache hit/miss, LRU, CDN, Redis, Memcached, ETag, Cache-Control, memoizacja.