← Back to Blog
TEKNIK

Redis Nedir?

F. Çağrı BilgehanJanuary 17, 202610 min read
rediscacheveritabanıperformans

Redis Nedir? In-Memory Veritabanı ve Cache Rehberi

Veritabanınız yavaş mı? API yanıt süreleri uzun mu? Cevap muhtemelen Redis — dünyanın en popüler in-memory veri deposu.

Redis Tanımı

Redis (Remote Dictionary Server), verileri bellekte (RAM) saklayan, açık kaynaklı bir veri yapısı deposudur. Disk tabanlı veritabanlarından 10-100x daha hızlıdır.

Neden Redis?

Disk tabanlı DB:  İstek → Disk I/O → Yanıt (5-50ms)
Redis:            İstek → RAM      → Yanıt (0.1-1ms)

Redis Veri Yapıları

1. String

SET user:42:name "Ali"
GET user:42:name → "Ali"

# Sayaç
INCR page:views → 1
INCR page:views → 2

2. Hash

HSET user:42 name "Ali" email "ali@example.com" age 28
HGET user:42 name → "Ali"
HGETALL user:42 → {name: "Ali", email: "ali@example.com", age: 28}

3. List

LPUSH notifications:42 "Yeni sipariş"
LPUSH notifications:42 "Ödeme onaylandı"
LRANGE notifications:42 0 -1 → ["Ödeme onaylandı", "Yeni sipariş"]

4. Set

SADD online:users "user:42" "user:55" "user:78"
SMEMBERS online:users → {"user:42", "user:55", "user:78"}
SCARD online:users → 3

5. Sorted Set

ZADD leaderboard 1500 "Ali" 2200 "Ayşe" 1800 "Mehmet"
ZREVRANGE leaderboard 0 2 → ["Ayşe", "Mehmet", "Ali"]

Redis Kullanım Senaryoları

1. Caching (Önbellekleme)

En yaygın kullanım. Sık erişilen verileri Redis'e koyarak veritabanı yükünü azaltma:

async function getUser(userId) {
  // Önce cache'e bak
  const cached = await redis.get(`user:${userId}`);
  if (cached) return JSON.parse(cached);

  // Cache'de yoksa DB'den al
  const user = await db.users.findById(userId);

  // Cache'e kaydet (1 saat TTL)
  await redis.set(`user:${userId}`, JSON.stringify(user), 'EX', 3600);

  return user;
}

2. Session Yönetimi

Kullanıcı oturumlarını Redis'te saklama (stateless uygulamalar için):

// Oturum oluştur
await redis.set(`session:${sessionId}`, JSON.stringify(userData), 'EX', 86400);

// Oturum kontrol
const session = await redis.get(`session:${sessionId}`);

3. Rate Limiting

API isteklerini sınırlandırma:

async function rateLimit(userId) {
  const key = `rate:${userId}`;
  const count = await redis.incr(key);
  if (count === 1) await redis.expire(key, 60); // 1 dakika
  return count <= 100; // 100 istek/dakika
}

4. Pub/Sub (Yayın/Abone)

Gerçek zamanlı mesajlaşma:

// Publisher
await redis.publish('orders', JSON.stringify({ orderId: 123 }));

// Subscriber
redis.subscribe('orders', (message) => {
  console.log('Yeni sipariş:', JSON.parse(message));
});

5. Queue (Kuyruk)

Arka plan iş kuyruğu (BullMQ, Celery):

// İşi kuyruğa ekle
await redis.lpush('email:queue', JSON.stringify({ to: 'ali@example.com' }));

// İşi al ve işle
const job = await redis.brpop('email:queue', 0);

Cache Stratejileri

| Strateji | Açıklama | Kullanım | |----------|----------|----------| | Cache-Aside | Uygulama cache'i yönetir | Genel amaçlı | | Write-Through | Yazma sırasında cache güncelle | Tutarlılık kritik | | Write-Behind | Önce cache'e yaz, sonra DB'ye | Performans kritik | | TTL | Süre dolunca otomatik sil | Çoğu senaryo |

Redis vs Alternatives

| Özellik | Redis | Memcached | DragonflyDB | |---------|-------|-----------|-------------| | Veri yapıları | Zengin | Sadece string | Zengin | | Persistence | Opsiyonel | Yok | Var | | Cluster | Var | Yok | Var | | Pub/Sub | Var | Yok | Var | | Bellek verimliliği | Orta | Yüksek | Yüksek |

Sonuç

Redis, uygulamanızın hızını dramatik olarak artırabilen güçlü bir araçtır. Caching, session, rate limiting ve real-time özellikler için idealdir. Ancak kalıcı veri depolamak için değil, tamamlayıcı bir katman olarak kullanılmalıdır.

Redis ve performans optimizasyonu LabLudus platformunda interaktif olarak öğretiliyor.

Related Posts

Acik Kaynak Yazilim Rehberi: Nedir, Nasil Katki Yapilir?

Acik kaynak yazilim nedir ve nasil katkida bulunulur?

CI/CD Nedir? Surekli Entegrasyon ve Dagitim Rehberi

CI/CD nedir ve nasil kurulur?