Rychlejší opakované čtení

Jak používat Redis cache v PHP aplikaci

Ulož drahý výsledek na chvíli do Redis. Pak si pohlídej klíče, dobu platnosti a mazání starých dat.

20 minut · PHP, Symfony a Redis

Nejdřív stručně

Kdy se Redis cache hodí?

Redis je rychlé úložiště v paměti. Pro cache se hodí, když stejná data čteš opakovaně a jejich výpočet nebo načtení je drahé.

Není to druhá databáze. Zdroj pravdy zůstává v databázi nebo jiné službě. Cache může kdykoli zmizet a aplikace musí umět data vytvořit znovu.

Připrav si

Co budeš potřebovat

Než něco uložíš, rozhodni se, co zrychluješ a kdy data přestanou platit.

  • Běžící Redis dostupný z PHP aplikace. V produkci ho nevystavuj veřejně do internetu.
  • PHP klient nebo Symfony Cache. Zvol jednu cestu pro celý projekt, aby se klíče a pravidla nerozjely.
  • Název klíče, který rozliší data. Například produkt, jazyk a verzi výpočtu.
  • Pravidlo pro dobu platnosti a invalidaci cache po změně zdrojových dat.

Krok 1

Přidej cache postupně

Začni jedním drahým místem. Nejprve ověř, že bez cache aplikace funguje správně.

1. Připoj Symfony k Redis

  1. Nainstaluj Symfony Cache, pokud ho projekt ještě nepoužívá.
  2. Adresu Redis dej do proměnné prostředí. Heslo ani celou adresu s heslem neukládej do repozitáře.
  3. Nastav Redis jako pool pro aplikační cache a ověř připojení v bezpečném prostředí.
composer require symfony/cache
Symfony Cache a Redis

2. Nastav klíč a dobu platnosti

  1. Klíč pojmenuj podle dat, ne podle stránky. Třeba product.42.cs.
  2. Dobu platnosti neboli TTL zvol podle toho, jak rychle se data mění. U cen může být krátká, u konfigurace delší.
  3. Do klíče přidej vše, co mění výsledek: jazyk, měnu, roli nebo filtr.
$item->expiresAfter(300); // 5 minut
Symfony: cache items

3. Při změně data smaž

  1. Po úpravě produktu smaž právě jeho klíč. Při další návštěvě se vytvoří čerstvý výsledek.
  2. Nespoléhej jen na TTL, pokud by uživatel mohl dlouho vidět chybnou cenu nebo stav objednávky.
  3. Nemaž celý Redis při každém uložení. Zbytečně tím zahodíš cache pro všechny ostatní.
$cache->delete('product.42.cs');
Symfony: mazání cache

Krok 2

Ověř cache hit i stará data

Nestačí, že Redis běží. Musíš vidět, že se data čtou z cache a po změně se správně obnoví.

  1. Ověř připojení

    Na stroji, kde Redis běží, čekej odpověď PONG. V produkci nepouštěj tento příkaz přes veřejný endpoint.

    redis-cli ping
  2. Načti stejná data dvakrát

    První čtení může být cache miss. Druhé by mělo použít uložený výsledek. Změř čas a zkontroluj aplikační log.

  3. Změň zdrojová data

    Uprav produkt, spusť invalidaci cache a znovu data načti. Musíš vidět novou hodnotu.

Když to zlobí

Nejčastější chyby

Aplikace hlásí connection refused

Zkontroluj host, port, síť mezi aplikací a Redis a přihlašovací údaje. Redis nenechávej veřejně otevřený jen proto, aby se připojení povedlo.

redis-cli ping
Cache nic nezrychlila

Podívej se, zda máš opakované čtení stejného klíče. Náhodný nebo příliš podrobný klíč dělá z každého čtení cache miss.

Uživatel vidí starou hodnotu

Invalidace cache musí proběhnout po změně zdroje. TTL je jen pojistka, ne náhrada důležitého mazání.

Redis se plní bez konce

Nastav rozumnou TTL, omezení paměti a sleduj počet klíčů. Neukládej celé velké odpovědi, když potřebuješ jen malý výsledek.

Hotovo

Cache je pod kontrolou.

Redis teď používáš na konkrétní drahou práci, s jasným klíčem, TTL a plánem pro smazání starých dat.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.