IHS Strategic
Tüm Blog Yazıları
HowTo09 Eylül 2026•2 dk okuma

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.

S

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 warning

Bağlantıyı test et:

docker exec -it redis-cache redis-cli ping
# Dönen yanıt: PONG

Adı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 sil

Modern 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 INCR ve EXPIRE komutlarını multi/exec zinciriyle tek seferde çalıştır.