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.