Redis ile Veri Önbelleğe Alma ve Oturum Yönetimi: Modern Web için Kapsamlı Rehber
Modern web uygulamalarında Redis ile önbelleğe alma (caching) ve dağıtık oturum yönetimini adım adım uygulayın. Performans optimizasyonu ve mimari stratejiler.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Web Mimarilerinde Redis Rolü
Veritabanı I/O maliyeti yüksek. Disk okuma yavaş, RAM hızlı. Redis in-memory veri yapısı sunar. Gecikme sürelerini milisaniyeden mikrosaniyeye indirir. Dijital ajans projelerinde ve yüksek trafikli sistemlerde sunucu maliyetini düşürür, yanıt hızını artırır.
Adım 1: Redis Sunucusunu Başlatma
Docker ile hızlı kurulum:
docker run --name redis-cache -p 6379:6379 -d redis:alpine redis-server --save 60 1 --loglevel warningBağlantıyı test et:
docker exec -it redis-cache redis-cli ping
# Dönen yanıt: PONGAdım 2: Cache-Aside (Lazy Loading) Deseni Uygulama
En yaygın önbellekleme stratejisi: Veriyi önce önbellekte ara. Varsa döndür (Cache Hit). Yoksa DB'den oku, önbelleğe yaz, döndür (Cache Miss).
import { createClient } from 'redis';
const redis = createClient({ url: 'redis://localhost:6379' });
await redis.connect();
async function getUser(id, db) {
const key = `user:${id}`;
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const user = await db.findUser(id);
if (user) {
await redis.setEx(key, 3600, JSON.stringify(user)); // TTL: 1 saat
}
return user;
}Kritik Kural: TTL (Time-To-Live) tanımlanmamış anahtarlar bellek şişmesine (OOM) yol açar. Her önbellek kaydına süre sınırı koy.
Adım 3: Dağıtık Oturum Yönetimi (Session Management)
Yatayda büyüyen (load-balanced) sistemlerde oturum bilgisi tek sunucu RAM'inde tutulamaz. Redis merkezi oturum deposu olarak çalışır.
Express ve Redis Entegrasyonu
import express from 'express';
import session from 'express-session';
import { RedisStore } from 'connect-redis';
import { createClient } from 'redis';
const app = express();
const redisClient = createClient({ url: 'redis://localhost:6379' });
await redisClient.connect();
const redisStore = new RedisStore({
client: redisClient,
prefix: 'sess:',
ttl: 86400 // 1 gün
});
app.use(session({
store: redisStore,
secret: process.env.SESSION_SECRET || 'dev-secret-key',
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.NODE_ENV === 'production',
httpOnly: true,
maxAge: 86400000
}
}));
app.get('/login', (req, res) => {
req.session.userId = 'user_123';
req.session.role = 'admin';
res.send('Oturum açıldı');
});
app.get('/me', (req, res) => {
if (!req.session.userId) return res.status(401).send('Yetkisiz');
res.json({ id: req.session.userId, role: req.session.role });
});Adım 4: Önbellek Temizleme (Invalidation) Stratejileri
Veri güncellendiğinde önbellek bayatlar. İki temizleme yaklaşımı:
- Write-Through / Delete on Update: Kayıt güncellendiği anda Redis anahtarını sil:
await redis.del(`user:${id}`); - Tag-Based Invalidation: İlişkili anahtarları set yapısıyla grupla ve toplu temizle.
Adım 5: Bellek Yönetimi ve Eviction İlkeleri
Redis bellek sınırına ulaştığında davranışı belirle. redis.conf yapılandırması:
maxmemory 512mb
maxmemory-policy allkeys-lru # En az kullanılan anahtarları otomatik silModern Web Trendleri ve En İyi Pratikler
- Redis Streams: Oturum logları ve gerçek zamanlı bildirim kuyrukları için standart.
- Upstash / Serverless Redis: Edge fonksiyonlarda (Vercel, Cloudflare Workers) bağlantı havuzu tükenmesini engelleyen HTTP tabanlı Redis trendi.
- Atomic İşlemler: Rate limiting için
INCRveEXPIREkomutlarını multi/exec zinciriyle tek seferde çalıştır.