Prečo Redis, keď Laravel funguje aj bez neho?
Laravel out-of-the-box podporuje viacero driverov pre cache aj session: file, database, array, redis, memcached. Predvolený je file driver, a pre malé projekty postačuje. Problém nastáva pri škálovaní.
| Driver | Rýchlosť čítania | Rýchlosť zápisu | Vhodný pre |
|---|---|---|---|
file | ~5 ms | ~8 ms | vývoj, mikroprojekty |
database | ~15–50 ms | ~20–60 ms | ak nemáte Redis |
redis | <1 ms | <1 ms | produkcia, vysoká záťaž |
memcached | <1 ms | <1 ms | legacy projekty |
Redis je in-memory databáza — dáta sú v RAM, nie na disku. Preto je rádovo rýchlejší. Navyše podporuje perzistenciu (RDB, AOF), pub/sub, sorted sets a Lua scripting — veci, ktoré Memcached nemá.
sudo apt install redis-server.Inštalácia a konfigurácia v Laravel 12
Laravel komunikuje s Redisom cez PHP rozšírenie phpredis alebo Composer balíček predis. Odporúčam phpredis — je to C rozšírenie, takže výrazne rýchlejšie.
# Inštalácia phpredis (Ubuntu/Debian)
sudo apt install php8.4-redis
# Alternatíva cez Composer (pomalší, ale bez systémovej závislosti)
composer require predis/predis
V súbore .env nastavte pripojenie:
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Konfigurácia v config/database.php sekcia redis je prednastavená správne. Odporúčam pridať prefix, ak na jednom Redis serveri beží viac aplikácií:
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'prefix' => env('REDIS_PREFIX', 'gear_'),
],
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD'),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],
],
database: 1) od session databázy (database: 0) zjednodušuje čistenie cache bez dotyku sessions.Cache — rýchly, tagovaný, invalidovateľný
V .env prepnite cache driver:
CACHE_DRIVER=redis
Laravel Cache facade potom automaticky používa Redis. Základné operácie:
use Illuminate\Support\Facades\Cache;
// Uloženie na 60 minút
Cache::put('produkty', $produkty, now()->addMinutes(60));
// Čítanie s fallbackom
$produkty = Cache::get('produkty', fn() => Produkt::all());
// Remember — automatický fallback + zápis
$produkty = Cache::remember('produkty', 3600, function () {
return Produkt::with('kategorie')->get();
});
// Zmazanie
Cache::forget('produkty');
Cache::flush(); // Pozor: maže všetok cache!
Cache Tags — skupinová invalidácia
Tags sú jedna z najsilnejších funkcií Redis cache. Umožňujú invalidovať skupinu kľúčov naraz — ideálne pri editovaní entít.
// Uloženie s tagom
Cache::tags(['produkty', 'eshop'])->put('produkt_42', $produkt, 3600);
Cache::tags(['kategorie'])->put('kat_elektronika', $kat, 7200);
// Invalidácia všetkého s tagom 'produkty'
Cache::tags(['produkty'])->flush();
// Tým pádom sa zmažú len produkt cache, nie kategorie
redis, memcached a array driverom. S file alebo database nie sú podporované.TTL stratégie — čo ako dlho cachevať
Neexistuje univerzálne pravidlo. Odporúčam vychádzať z volatility dát:
- Statické dáta (typy doručenia, krajiny): 24 hodín+
- Zoznamy produktov: 15–60 minút, invalidovať pri uložení
- Detail produktu: 5–15 minút, alebo event-driven invalidácia
- Výsledky vyhľadávania: 5 minút maximum
- Používateľské dáta: nikdy nekešovať bez explicitnej invalidácie pri zmene
Session storage — preč z MySQL
Session driver database generuje SQL dopyt pri každej požiadavke. Pri 100 súbežných používateľoch je to 100 zbytočných SELECT dopytov za sekundu. Redis to rieši v pamäti.
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_CONNECTION=default
V config/session.php skontrolujte, že 'connection' ukazuje na správne Redis spojenie. Pre session odporúčam database: 0 (oddelené od cache).
'connection' => env('SESSION_CONNECTION', 'default'),
Session dáta sa v Redis ukladajú ako hash s TTL rovnajúcim sa SESSION_LIFETIME. Automaticky expirujú — netreba žiadne cleanup joby ako pri database driveri.
Queues — asynchrónne úlohy cez Redis
Redis queue driver je predvolená voľba pre produkčné Laravel aplikácie. Je rýchlejší ako database a podporuje prioritné fronty, delayed jobs aj job batching.
QUEUE_CONNECTION=redis
Spustenie workera:
# Základný worker
php artisan queue:work redis --queue=high,default
# Pre produkciu odporúčam Supervisor
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work redis --queue=high,default --tries=3
autostart=true
autorestart=true
numprocs=4
redirect_stderr=true
Laravel Horizon — monitoring a škálovanie
Pre produkčné projekty s Redis queues je Laravel Horizon nutnosť. Poskytuje real-time dashboard pre monitorovanie jobov, throughput metriky a automatické škálovanie workerov.
composer require laravel/horizon
php artisan horizon:install
php artisan horizon
Horizon dashboard je dostupný na /horizon. Nakonfigurujte prístup v config/horizon.php cez gate() callback — nikdy nenechajte dashboard verejne prístupný.
// app/Providers/HorizonServiceProvider.php
protected function gate(): void
{
Gate::define('viewHorizon', function (User $user) {
return in_array($user->email, [
'admin@vasa-domena.sk',
]);
});
}
Event-driven invalidácia cache
Najrobustnejšia stratégia pre cache invalidáciu je reagovať na Model eventy. Keď sa záznam zmení, cache sa automaticky invaliduje.
// app/Models/Produkt.php
protected static function booted(): void
{
static::saved(function (Produkt $produkt) {
Cache::tags(['produkty'])->flush();
Cache::forget("produkt_{$produkt->id}");
});
static::deleted(function (Produkt $produkt) {
Cache::tags(['produkty'])->flush();
Cache::forget("produkt_{$produkt->id}");
});
}
Redis na produkčnom serveri — zabezpečenie
Redis predvolene počúva na 127.0.0.1:6379 bez hesla. Pre produkciu:
- Nastavte
requirepassv/etc/redis/redis.conf - Zakážte nebezpečné príkazy:
rename-command FLUSHALL "" - Použite Unix socket namiesto TCP pre lokálne spojenie (rýchlejšie)
- Firewall: Redis port 6379 musí byť prístupný iba lokálne
# /etc/redis/redis.conf
bind 127.0.0.1 ::1
requirepass vas-bezpecny-redis-password
maxmemory 512mb
maxmemory-policy allkeys-lru
Politika allkeys-lru znamená: keď Redis dosiahne limit pamäte, vymaže najmenej používané kľúče. Ideálne pre cache workload.
Záver: Redis mení výkon aplikácie fundamentálne
Tri zmeny v .env — CACHE_DRIVER=redis, SESSION_DRIVER=redis, QUEUE_CONNECTION=redis — a vaša Laravel aplikácia je výrazne rýchlejšia. Redis znižuje záťaž na databázu, eliminuje I/O operácie so súborovým systémom a otvára dvere pre pokročilé funkcie ako tagovaná cache alebo Laravel Horizon.
Pri správnom nastavení TTL stratégií a event-driven invalidácii dostanete cache, ktorá je rýchla aj konzistentná — bez trade-offov.
Potrebujete Redis integráciu alebo audit výkonu?
Navrhnem a implementujem Redis stack pre váš Laravel projekt — od inštalácie po Horizon monitoring a caching stratégiu. Odpoveď do 24 hodín.
Nezáväzný dopyt