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);
});
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);
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
requirepassile parola, ACL ile kullanıcı yönetimibind 127.0.0.1veya firewall ile sadece uygulama sunucusuprotected-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.
Uygulamanıza Redis entegrasyonu, cluster mimarisi ve persistence yapılandırması için iletişime geçin