
Redis Cache Katmanı - Node.js ve Laravel'de Session ve Cache Yönetimi
Veritabanı sorguları uygulamanızın en yavaş katmanıdır. Sık erişilen veriler için her seferinde disk I/O yapan bir SQL sorgusu çalıştırmak yerine, bu verileri bellekte tutan bir cache katmanı eklemek yanıt sürelerini milisaniye seviyesine düşürür. Redis, in-memory veri yapısı deposu olarak cache, se
Ahmet Yılmaz
Kıdemli Altyapı Mühendisi
Veritabanı sorguları uygulamanızın en yavaş katmanıdır. Sık erişilen veriler için her seferinde disk I/O yapan bir SQL sorgusu çalıştırmak yerine, bu verileri bellekte tutan bir cache katmanı eklemek yanıt sürelerini milisaniye seviyesine düşürür. Redis, in-memory veri yapısı deposu olarak cache, session yönetimi, rate limiting ve pub/sub gibi kullanım senaryolarında standart haline gelmiştir. Bu rehberde Redis'i Node.js ve Laravel uygulamalarına entegre etmeyi, doğru cache stratejisini seçmeyi ve production ortamında ölçeklemeyi somut örneklerle açıklıyoruz.
Neden Redis?
Redis tüm veriyi RAM'de tutar ve tek thread event loop mimarisi ile saniyede 100.000+ okuma/yazma işlemi gerçekleştirir. Tipik bir PostgreSQL sorgusu 5-50ms sürerken, Redis'ten aynı veriyi okumak 0.1-1ms sürer.
Sub-millisecond Latency
Tüm veri RAM'de tutulur. Disk I/O beklemesi yoktur. GET/SET operasyonları ortalama 0.1-0.5ms sürer.
Zengin Veri Yapıları
String, Hash, List, Set, Sorted Set, Stream gibi veri yapıları ile leaderboard, kuyruk, session gibi farklı senaryoları destekler.
Persistence Seçenekleri
RDB snapshot ve AOF (Append Only File) ile veri kaybını minimize edin. Cache için persistence kapatılabilir.
Redis Kurulumu ve Temel Yapılandırma
# Redis 7.x kurulumu
sudo apt update
sudo apt install redis-server -y
# Servis durumunu kontrol et
sudo systemctl status redis-server
# Baglanti testi
redis-cli ping
# PONG
Production ortamı için redis.conf dosyasında şu ayarları yapın:
# Sadece localhost'tan erisim (guvenlik)
bind 127.0.0.1
# Sifre zorunlu
requirepass guclu-bir-sifre-buraya
# Maksimum bellek limiti
maxmemory 2gb
# Bellek dolunca en az kullanilan key'i sil
maxmemory-policy allkeys-lru
# Cache icin persistence kapatilabilir (hiz icin)
save ""
appendonly no
⚠️ Güvenlik: Redis varsayılan olarak şifresiz gelir ve tüm komutlara erişim açıktır. Production'da mutlaka requirepass ayarlayın, bind ile erişimi kısıtlayın ve tehlikeli komutları (FLUSHALL, CONFIG, DEBUG) rename-command ile devre dışı bırakın.
Node.js ile Redis Entegrasyonu
npm install ioredis
import Redis from 'ioredis';
const redis = new Redis({
host: '127.0.0.1',
port: 6379,
password: process.env.REDIS_PASSWORD,
maxRetriesPerRequest: 3,
retryStrategy(times) {
return Math.min(times * 50, 2000);
}
});
// Cache-aside pattern: once cache'e bak, yoksa DB'den al
async function getProduct(productId) {
const cacheKey = `product:${productId}`;
// 1. Cache'den oku
const cached = await redis.get(cacheKey);
if (cached) {
return JSON.parse(cached);
}
// 2. Cache'de yoksa DB'den al
const product = await db.query('SELECT * FROM products WHERE id = $1', [productId]);
// 3. Cache'e yaz (TTL: 1 saat)
await redis.setex(cacheKey, 3600, JSON.stringify(product));
return product;
}
// Cache invalidation: urun guncellendiginde cache'i temizle
async function updateProduct(productId, data) {
await db.query('UPDATE products SET ... WHERE id = $1', [productId]);
await redis.del(`product:${productId}`);
}
Express.js Session Yönetimi
import session from 'express-session';
import RedisStore from 'connect-redis';
app.use(session({
store: new RedisStore({ client: redis }),
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: true,
httpOnly: true,
maxAge: 86400000 // 24 saat
}
}));
Laravel ile Redis Entegrasyonu
Laravel Redis'i cache, session, queue ve broadcasting için native olarak destekler. .env dosyasında driver'ları Redis'e yönlendirmek yeterlidir:
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=guclu-sifre
REDIS_PORT=6379
use Illuminate\Support\Facades\Cache;
// Cache::remember - yoksa hesapla ve cache'le
public function show($id)
{
$product = Cache::remember("product:{$id}", 3600, function () use ($id) {
return Product::with('category', 'reviews')->findOrFail($id);
});
return view('products.show', compact('product'));
}
// Cache invalidation - Model Observer ile
public function updated(Product $product)
{
Cache::forget("product:{$product->id}");
Cache::tags(['products'])->flush();
}
Cache Stratejileri ve TTL Yönetimi
| Strateji | Nasıl Çalışır | Ne Zaman Kullanılır |
|---|---|---|
| Cache-Aside (Lazy Loading) | Uygulama cache'i kontrol eder. Miss olursa DB'den alıp cache'e yazar. | Genel amaçlı, en yaygın pattern |
| Write-Through | Her yazma işlemi hem DB'ye hem cache'e yapılır. | Veri tutarlılığı kritik, okuma yoğun |
| Write-Behind | Önce cache'e yaz, DB'ye asenkron olarak yaz. | Yüksek yazma hacmi, eventual consistency kabul edilebilir |
| Read-Through | Cache katmanı DB'den okumayı otomatik yapar. | Uygulama kodunu basitleştirmek istediğinizde |
💡 TTL Stratejisi: Statik veriler (ülke listesi, kategori ağacı) için uzun TTL (24 saat+), sık değişen veriler (stok durumu, fiyat) için kısa TTL (1-5 dakika), kullanıcıya özel veriler (sepet, session) için orta TTL (1-24 saat) kullanın. Cache stampede'i önlemek için TTL'e rastgele jitter ekleyin: TTL + random(0, 60)
PostgreSQL optimizasyonu için PostgreSQL Performans Optimizasyonu rehberimizi, bağlantı yönetimi için PgBouncer ile Connection Pooling rehberimizi, Node.js production için Node.js PM2 Production rehberimizi inceleyin. Redis Resmi Dokümantasyonu ve Laravel Redis Dokümantasyonu ek kaynak olarak faydalıdır.
Sıkça Sorulan Sorular
Redis ne kadar RAM gerektirir?
Redis'in bellek tüketimi sakladığınız veri miktarına bağlıdır. Genel kural olarak veri boyutunun 2-3 katı RAM ayırın (overhead ve fragmantasyon için). 1 milyon basit key-value çifti yaklaşık 100-200 MB tüketir. maxmemory ayarı ile üst limiti belirleyin.
Redis çökerse veriler kaybolur mu?
Cache olarak kullanıyorsanız veri kaybı sorun değildir - uygulama DB'den tekrar okur. Session veya kuyruk gibi kritik veriler için AOF persistence'ı etkinleştirin. AOF her yazma işlemini diske loglar ve restart sonrası veriyi geri yükler.
Redis vs Memcached hangisini seçmeliyim?
Redis daha zengin veri yapıları (hash, list, set, sorted set), persistence, pub/sub ve Lua scripting sunar. Memcached sadece basit key-value cache için uygundur ve multi-thread mimarisi ile çok çekirdekli sunucularda avantajlıdır. Çoğu modern uygulama için Redis tercih edilmelidir.
Cache invalidation nasıl yapılmalı?
En güvenilir yöntem write-through veya explicit invalidation'dır: veri güncellendiğinde ilgili cache key'ini silin. Tag-based invalidation (Laravel Cache Tags) ile ilişkili key gruplarını toplu temizleyebilirsiniz. TTL ile otomatik expire de ek güvenlik katmanı sağlar.
Sonuç
Redis cache katmanı eklemek uygulamanızın yanıt sürelerini 10-100x iyileştirebilir ve veritabanı yükünü önemli ölçüde azaltır. Cache-aside pattern ile başlayın, TTL stratejinizi veri değişim sıklığına göre belirleyin ve cache invalidation'ı ihmal etmeyin. Production ortamında maxmemory limiti, güvenlik ayarları ve monitoring'i mutlaka yapılandırın.
Redis ve Veritabanınız İçin Güçlü Sunucular
Hosted Cloud'un yüksek RAM kapasiteli bulut sunucuları ile Redis cache performansınızı maksimize edin.
Bulut Sunucu Planlarını İncele →Ahmet Yılmaz
Kıdemli Altyapı Mühendisi
10 yılı aşkın bulut altyapısı ve DevOps deneyimiyle Hosted Cloud'un teknik ekibinde yer almaktadır. Kubernetes, Terraform ve yüksek erişilebilirlik mimarileri üzerine uzmanlaşmıştır.
Yorumlar yakında