Redis ile Veri Önbelleğe Alma ve Oturum Yönetimi Rehberi
Modern web uygulamalarında Redis ile yüksek performanslı veri önbelleğe alma ve güvenli oturum yönetimi uygulama adımları.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Web Mimarilerinde Redis
Veritabanı darboğazı modern web projelerinde en sık görülen yavaşlık sebebi. Disk I/O yavaş, RAM hızlı. Redis in-memory veri tabanıdır. Okuma/yazma gecikmesini mikrosaniyelere indirir. Bir dijital ajans için yüksek trafikli müşteri sitelerinde sunucu maliyetini düşürmek ve yanıt süresini kesmek için standart araçtır. Güncel trendler, state tutmayan mikroservis mimarilerini ve merkezi Redis oturum depolarını zorunlu kılıyor.
Adım 1: Redis Kurulumu ve Bağlantı
Docker ile en hızlı kurulum:
docker run --name redis-cache -p 6379:6379 -d redis:alpine --requirepass gizlisifreUygulama katmanında bağlantı açma (Node.js / ioredis örneği):
const Redis = require('ioredis');
const redis = new Redis({
host: '127.0.0.1',
port: 6379,
password: 'gizlisifre'
});Adım 2: Cache-Aside (Lazy Loading) Stratejisi
Veri önce Redis'e sorulur. Varsa döner (Cache Hit). Yoksa DB'den okunur, Redis'e yazılır, istemciye iletilir (Cache Miss).
async function getProduct(id) {
const key = `product:${id}`;
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const product = await db.query('SELECT * FROM products WHERE id = ?', [id]);
if (product) {
await redis.set(key, JSON.stringify(product), 'EX', 3600); // 1 saat TTL
}
return product;
}Kritik Kural: Asla TTL (Time-to-Live) vermeden anahtar kaydetmeyin. Bellek dolar, OOM (Out Of Memory) hatası oluşur.
Adım 3: Merkezi Oturum (Session) Yönetimi
Monolitik yapılarda oturum bellekte tutulur. Çoklu sunuculu mimarilerde oturum kaybolur. Çözüm: Oturumu Redis üzerinde tutmak.
const session = require('express-session');
const RedisStore = require('connect-redis').default;
app.use(session({
store: new RedisStore({ client: redis, prefix: 'sess:' }),
secret: 'guclu-anahtar',
resave: false,
saveUninitialized: false,
cookie: { secure: true, httpOnly: true, maxAge: 86400000 }
}));- Sunucu restart olsa bile oturumlar silinmez.
- Load balancer arkasındaki tüm sunucular aynı oturum verisine erişir.
Adım 4: Cache Invalidation (Önbellek Geçersiz Kılma)
DB güncellendiğinde önbellek temizlenmeli. İki yöntem:
- Aktif Silme: Kayıt güncellendiğinde
redis.del(`product:${id}`)tetiklenir. - Write-Through: DB güncellenirken eşzamanlı olarak Redis de güncellenir.
Performans ve Bellek Optimizasyon İpuçları
- Eviction Policy:
maxmemory-policy allkeys-lruayarla. Bellek dolduğunda en az kullanılan anahtarları otomatik siler. - Key İsimlendirme: Standart namespace kullan:
app:modul:id(Örnek:ecom:user:42). - Büyük Veri Paketleri: 1 MB üzeri nesneleri doğrudan Redis'e atma. Parçala veya sıkıştır.