Redis, modern web yığınının omurgasıdır — in-memory, sub-millisecond latency, zengin veri tipleri. Cache''ten session store''a, rate limit''ten pub/sub''a kadar 5+ farklı problemi çözer. Bu yazı Redis''in en yaygın kullanım senaryolarını ve üretim konfigürasyonunu özetler.

Veri Tipleri

İlgili rehberler: Yazılım geliştirme süreçleri · PostgreSQL optimizasyonu · Git ileri seviye komutlar · Redis nedir, nasıl kullanılır · Docker ile deploy

  • String — basic key-value
  • Hash — object (field-value map)
  • List — sıralı dizi, sondan/baştan ekleme
  • Set — benzersiz eleman
  • Sorted set — score ile sıralı set (leaderboard)
  • Stream — append-only log (Kafka''nın Redis sürümü)
  • Bitmap, HyperLogLog, Geo — özel amaçlar

Kullanım 1: Cache

const Redis = require('ioredis');
const redis = new Redis();

async function getUser(id) {
    const cacheKey = `user:${id}`;
    const cached = await redis.get(cacheKey);
    if (cached) return JSON.parse(cached);

    const user = await db.users.findByPk(id);
    await redis.set(cacheKey, JSON.stringify(user), 'EX', 300);  // 5 dk TTL
    return user;
}

// Invalidation
async function updateUser(id, data) {
    const user = await db.users.update(id, data);
    await redis.del(`user:${id}`);  // Cache'i sil
    return user;
}

Kullanım 2: Session Store

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,
    resave: false,
    saveUninitialized: false,
    cookie: { httpOnly: true, secure: true, maxAge: 7 * 24 * 3600 * 1000 }
}));

Kullanım 3: Rate Limit

// Sliding window rate limit
async function checkRateLimit(userId, maxPerMinute = 60) {
    const key = `rate:${userId}:${Math.floor(Date.now() / 60000)}`;
    const count = await redis.incr(key);
    if (count === 1) await redis.expire(key, 60);
    return count <= maxPerMinute;
}

if (!(await checkRateLimit(req.user.id))) {
    return res.status(429).json({ error: 'Too many requests' });
}

Kullanım 4: Pub/Sub

// Publisher
redis.publish('notifications', JSON.stringify({ userId: 42, msg: 'Hi' }));

// Subscriber (ayrı connection gerekli)
const sub = new Redis();
sub.subscribe('notifications');
sub.on('message', (channel, message) => {
    const data = JSON.parse(message);
    io.to(`user:${data.userId}`).emit('notification', data);
});
Bilgi
Redis 5+''da Streams pub/sub''dan üstündür — mesajlar kalıcı, consumer group''lar var, tekrar okunabilir. Yeni projelerde stream''i tercih edin.

Kullanım 5: Distributed Lock

// SET NX EX ile atomic lock
async function withLock(key, ttlSec, fn) {
    const token = Math.random().toString(36);
    const acquired = await redis.set(key, token, 'NX', 'EX', ttlSec);
    if (!acquired) throw new Error('Lock busy');
    try {
        return await fn();
    } finally {
        // Lua script ile sadece kendi token'ını sil
        await redis.eval(`
            if redis.call('get', KEYS[1]) == ARGV[1] then
                return redis.call('del', KEYS[1])
            else return 0 end
        `, 1, key, token);
    }
}

await withLock('job:daily-report', 300, generateReport);
Uyarı
Basit lock dağıtık ortamda tamamen güvenli değildir (clock drift, failover). Kritik iş için Redlock algoritmasını kullanın.

Persistence: RDB vs AOF

Redis memory''dedir — restart''ta kaybolabilir. İki persistence seçeneği var:

  • RDB (snapshot): Belirli aralıklarla full dump. Hızlı restart, küçük dosya. Son N dk kaybolabilir
  • AOF (append-only file): Her komut log''lanır. Daha güvenli ama dosya büyük, restart yavaş
  • Hibrit: İkisini de aç — çoğu üretim kurulumu böyle
# redis.conf
save 900 1       # 15 dk içinde 1 değişiklik
save 300 10      # 5 dk içinde 10
save 60 10000    # 1 dk içinde 10000
appendonly yes
appendfsync everysec   # saniyede 1 fsync (iyi denge)

Memory Yönetimi

# Maksimum bellek
maxmemory 2gb

# Dolunca ne yapılacak
maxmemory-policy allkeys-lru   # En az kullanılanı sil
# Alternatif: volatile-lru, allkeys-lfu, noeviction

# Büyük key'leri bul
redis-cli --bigkeys

Cluster ve Sentinel

  • Master-Replica (1 master + N replica): Read scaling, read-from-replica
  • Redis Sentinel: Otomatik failover (master öldüğünde replica promote)
  • Redis Cluster: Sharding, tek cluster''da 1000+ instance

Güvenlik

  • Redis default port''ta (6379) auth yok, dışarıdan açıkta olursa felakettir
  • requirepass ile parola, ACL ile kullanıcı yönetimi
  • bind 127.0.0.1 veya firewall ile sadece uygulama sunucusu
  • protected-mode yes — default aktif ama kontrol et
  • TLS destekli bağlantı (Redis 6+)
  • Tehlikeli komutları rename et: rename-command FLUSHALL ""

Monitoring

redis-cli INFO stats
redis-cli INFO memory
redis-cli INFO replication
redis-cli SLOWLOG GET 10

# Prometheus exporter
docker run -p 9121:9121 oliver006/redis_exporter

Modern Yazılım Geliştirme ve DevOps Pratikleri

Profesyonel yazılım geliştirme süreci üç pillar üzerine kuruludur: kaynak kontrolü (Git + GitHub/GitLab pull request akışı, code review zorunlu), CI/CD pipeline (otomatik test + lint + build + deploy), ve gözlemlenebilirlik (Sentry/Datadog/Grafana ile log, metric, trace toplama). Test piramidi (unit > integration > e2e) ile kod kalitesini garantilemek, mikroservis mimarisinde Docker container ve Kubernetes orkestrasyonu kullanmak, REST veya GraphQL API tasarımında OpenAPI/GraphQL Schema sözleşmesi tutmak modern standardlardır. Yazılım geliştirme yaşam döngüsü boyunca (gereksinim → tasarım → implementasyon → test → deploy → bakım) Agile/Scrum sprintleri 1-2 hafta, DevOps takımları sürekli teslim (continuous delivery) prensibiyle çalışır.

Redis kurulumu ve optimizasyonu

Uygulamanıza Redis entegrasyonu, cluster mimarisi ve persistence yapılandırması için iletişime geçin

WhatsApp