Redis Cache Katmanı - Node.js ve Laravel'de Session ve Cache Yönetimi

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

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

bash - Redis kurulumu (Ubuntu/Debian)
# 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:

redis.conf
# 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

bash
npm install ioredis
cache.js - Node.js cache katmani
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

app.js - Express session with Redis
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:

.env
CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=guclu-sifre
REDIS_PORT=6379
ProductController.php - Laravel cache ornegi
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 →
A

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