Redis ile Veri Önbelleğe Alma ve Oturum Yönetimi Rehberi
Modern web uygulamalarında Redis kullanarak veri önbelleğe alma (caching) ve dağıtık oturum (session) yönetimi uygulama adımları.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Giriş
Modern web mimarilerinde veritabanı darboğazlarını önlemek ve yanıt sürelerini düşürmek için RAM tabanlı anahtar-değer depoları kullanılır. Redis, yüksek okuma/yazma hızı nedeniyle veri önbellekleme ve dağıtık oturum yönetimi için endüstri standardıdır. Bu rehber, performans odaklı dijital ajans projeleri ve yüksek trafikli sistemler için adım adım Redis entegrasyonunu açıklar.
1. Redis Kurulumu ve Bağlantı
Docker ile yerel Redis örneği başlatma:
docker run -d --name redis-cache -p 6379:6379 redis:7-alpine --maxmemory 256mb --maxmemory-policy allkeys-lruNode.js (native ioredis) istemci bağlantısı:
const Redis = require('ioredis');
const redis = new Redis({ host: '127.0.0.1', port: 6379 });
redis.on('error', (err) => console.error('Redis Hata:', err));2. Cache-Aside Deseni ile Veri Önbelleğe Alma
En yaygın önbellekleme stratejisi Cache-Aside desenidir. Veri önce Redis içinde aranır; bulunamazsa ana veritabanından çekilir, Redis'e yazılır ve istemciye iletilir.
Adım Adım Örnek:
async function getProduct(id) {
const cacheKey = `product:${id}`;
const cached = await redis.get(cacheKey);
if (cached) return JSON.parse(cached);
// Veritabanı sorgusu simülasyonu
const product = await db.query('SELECT * FROM products WHERE id = ?', [id]);
if (!product) return null;
// 1 saat (3600 sn) TTL ile kaydet
await redis.set(cacheKey, JSON.stringify(product), 'EX', 3600);
return product;
}İpucu: Önbellek şişmesini önlemek için her anahtara mutlaka TTL (Time-To-Live) tanımlanmalıdır.
3. Dağıtık Oturum (Session) Yönetimi
Birden fazla uygulama sunucusunun çalıştığı ortamlarda oturum verileri sunucu belleğinde tutulamaz. Redis, oturum verilerinin merkezi ve paylaşımlı saklanmasını sağlar.
Express + connect-redis Uygulaması:
const session = require('express-session');
const RedisStore = require('connect-redis').default;
app.use(session({
store: new RedisStore({ client: redis, prefix: 'sess:' }),
secret: process.env.SESSION_SECRET || 'gizli-anahtar',
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.NODE_ENV === 'production',
httpOnly: true,
maxAge: 86400000 // 1 gün
}
}));4. Bellek Yönetimi ve Tahliye Politikaları
Bellek dolduğunda Redis'in eski verileri temizleme yöntemi maxmemory-policy ile belirlenir:
- allkeys-lru: En az kullanılan anahtarları siler. Saf önbellek kullanımı için önerilir.
- volatile-lru: Sadece TTL atanmış anahtarlardan en az kullanılanları siler. Oturum verileri ile önbellek verileri aynı sunucuda paylaşıldığında güvenlidir.
- noeviction: Bellek dolduğunda yazma işlemlerini reddeder. Veri kaybına izin vermeyen yapılar içindir.
5. Modern Web Trendleri ve En İyi Pratikler
- Önbellek Geçersiz Kılma (Cache Invalidation): Veri güncellendiğinde ilgili Redis anahtarını silin (
redis.del(`product:${id}`)). - Cache Stampede Önleme: Popüler anahtarların süresi dolduğunda aynı anda binlerce isteğin veritabanına gitmesini engellemek için mutex/kilit yapıları veya erken yenileme uygulayın.
- Veri Sıkıştırma: Büyük JSON yüklerini kaydetmeden önce Brotli/Gzip ile sıkıştırmak RAM tüketimini %70'e kadar azaltır.