Gereksinimler ve Ön Hazırlık
Uygulamaya başlamadan önce sisteminizde Node.js (v20 veya üzeri önerilir) ve Redis sunucusunun kurulu olması gerekir. Redis'i yerel makinenizde Docker aracılığıyla çalıştırmak, geliştirme ortamınızı temiz tutmanızı sağlar.
- Node.js: Proje bağımlılıklarını yönetmek için npm veya pnpm.
- Redis: Verileri RAM üzerinde tutan anahtar-değer deposu.
- Redis Kütüphanesi: Node.js tarafında
redis(node-redis) paketi.
Projenizi başlatmak ve gerekli kütüphaneyi kurmak için terminalinizde şu komutları çalıştırın:
mkdir node-redis-cache
cd node-redis-cache
npm init -y
npm install redis
Bu kurulumlar, Redis sunucusu ile Node.js uygulamanız arasında güvenli ve hızlı bir köprü kurmanızı sağlar.
Redis Sunucusuna Bağlantı Kurma
Redis ile çalışırken ilk adım, istemciyi (client) yapılandırmak ve sunucuya bağlanmaktır. Redis, asenkron bir yapıya sahip olduğu için bağlantı hatalarını yönetmek uygulamanın kararlılığı için kritiktir.
const redis = require('redis');
const client = redis.createClient({
url: 'redis://localhost:6379'
});
client.on('error', (err) => console.log('Redis İstemci Hatası', err));
async function connectRedis() {
await client.connect();
console.log('Redis sunucusuna başarıyla bağlandı.');
}
connectRedis();
Yukarıdaki kod bloğu, Redis istemcisini oluşturur ve yerel sunucuya bağlanır. client.on('error') bloğu, bağlantı kesilmesi veya sunucu hatalarında uygulamanızın çökmesini engeller.
Önbellekleme Stratejisi: Cache-Aside Modeli
Cache-aside, en yaygın kullanılan önbellekleme stratejisidir. Bu yöntemde uygulama, önce veriyi Redis'te arar. Eğer veri varsa (cache hit), doğrudan Redis'ten döner. Eğer yoksa (cache miss), veritabanından sorgular, Redis'e kaydeder ve kullanıcıya sunar.
async function getCachedData(key, fetchFunction) {
const cachedData = await client.get(key);
if (cachedData) {
return JSON.parse(cachedData); // Önbellekten dön
}
const freshData = await fetchFunction(); // Veritabanından çek
await client.setEx(key, 3600, JSON.stringify(freshData)); // 1 saat önbellekle
return freshData;
}
Burada kullanılan setEx komutu, anahtara bir "yaşam süresi" (TTL - Time To Live) atar. Bu, verinin sonsuza kadar önbellekte kalmasını engelleyerek güncelliği korur.
Performans Karşılaştırması: Veritabanı vs Redis
Aşağıdaki tablo, standart bir veritabanı sorgusu ile Redis önbellekleme arasındaki temel farkları göstermektedir.
| Özellik | Veritabanı (PostgreSQL/MongoDB) | Redis Önbellek |
|---|---|---|
| Depolama | Disk (HDD/SSD) | RAM (Bellek) |
| Hız | Yavaş (Disk I/O) | Çok Hızlı (Mikrosaniye) |
| Veri Yapısı | İlişkisel/Doküman | Anahtar-Değer (Basit) |
| Kullanım | Kalıcı Veri | Geçici/Sık Erişimli Veri |
Veri Güncelleme ve Geçersiz Kılma (Invalidation)
Önbelleklemedeki en büyük zorluk, veritabanındaki veri değiştiğinde önbellekteki eski veriyi temizlemektir. Veri güncellendiğinde, ilgili anahtarı Redis'ten silmek en sağlıklı yöntemdir.
async function updateProduct(id, newData) {
// 1. Veritabanında güncelle
await db.products.update(id, newData);
// 2. Redis'teki eski veriyi sil
await client.del(`product:${id}`);
}
Bu yaklaşım, veritabanı ile önbelleğin senkronize kalmasını sağlar. Eğer silme işlemini yapmazsanız, kullanıcılar eski verileri görmeye devam edecektir.
Güvenlik Uyarısı: Redis sunucunuzu asla dış dünyaya (public) açmayın. Her zaman güvenli bir ağ içerisinde çalıştırın ve güçlü bir şifre (requirepass) kullanın. Üretim ortamında (production) Redis bağlantılarını her zaman TLS/SSL ile şifreleyin.
Sıkça Sorulan Sorular
Redis önbelleği ne zaman temizlenmelidir?
Veritabanında bir "Write" (yazma) işlemi yapıldığında veya verinin geçerlilik süresi (TTL) dolduğunda temizlenmelidir.
Her veri Redis'te saklanmalı mıdır?
Hayır, sadece çok sık okunan ve nadir güncellenen veriler (örneğin; ürün listeleri, kullanıcı oturum bilgileri) Redis'te saklanmalıdır.
Cache miss durumunda sistem yavaşlar mı?
Cache miss anında veritabanına gidildiği için bir defaya mahsus yavaşlık yaşanır, ancak bu durum sistemin genel performansını bozmaz.
Redis verileri kalıcı mıdır?
Redis varsayılan olarak bellek tabanlıdır; ancak RDB veya AOF yapılandırmaları ile verileri diske kaydederek kalıcılık sağlayabilirsiniz.
Redis'te maksimum bellek dolarsa ne olur?
Redis'in "eviction policy" ayarına bağlı olarak, eski veya en az kullanılan veriler silinerek yeni verilere yer açılır.
Redis İleri Seviye Hata Ayıklama ve İzleme
Redis önbellekleme katmanında yaşanan sorunlar, genellikle uygulamanın genel performansını doğrudan etkiler. Sistemin sağlıklı çalıştığından emin olmak için Redis üzerindeki operasyonları anlık olarak izlemek ve hata loglarını analiz etmek kritik öneme sahiptir.
Redis Monitor Komutu ile Trafiği İzleme
Geliştirme aşamasında, uygulamanızın Redis'e hangi komutları gönderdiğini görmek için MONITOR komutunu kullanabilirsiniz. Bu komut, Redis sunucusuna gelen her isteği gerçek zamanlı olarak konsola döker.
// Redis CLI üzerinden izleme başlatma
redis-cli MONITOR
// Node.js tarafında hata yönetimi ve loglama
client.on('error', (err) => {
console.error('Redis Bağlantı Hatası:', err);
// Hata durumunda veritabanına doğrudan erişim stratejisi uygulanabilir
});
Redis Insight Kullanımı
Komut satırı araçlarının yanı sıra, Redis verilerini görselleştirmek ve bellek kullanımını analiz etmek için Redis Insight gibi araçları kullanmanız önerilir. Bu araçlar sayesinde:
- Anahtar (key) dağılımını görebilirsiniz.
- Bellek kullanımını grafiksel olarak takip edebilirsiniz.
- Yavaş sorguları (slowlog) tespit ederek optimize edebilirsiniz.
Üretim Ortamında Deployment Stratejileri
Redis'i üretim ortamına (production) taşırken, sadece kodun çalışması yeterli değildir. Yüksek erişilebilirlik ve veri güvenliği için aşağıdaki yapılandırmaları göz önünde bulundurmalısınız.
Bağlantı Havuzu (Connection Pooling) Yönetimi
Node.js tarafında her istek için yeni bir Redis bağlantısı açmak yerine, bağlantı havuzu kullanarak kaynakları verimli yönetmelisiniz. node-redis kütüphanesi varsayılan olarak bağlantıyı yönetse de, yüksek trafikli sistemlerde bağlantı limitlerini yapılandırmak önemlidir.
const redis = require('redis');
const client = redis.createClient({
url: 'redis://alice:foobared@awesome.redis.server:6380',
socket: {
connectTimeout: 5000,
reconnectStrategy: (retries) => {
if (retries > 10) return new Error('Max retries reached');
return Math.min(retries * 50, 2000);
}
}
});
await client.connect();
Veri Güvenliği ve Şifreleme
Redis verileri varsayılan olarak düz metin (plain-text) olarak saklanır. Hassas verileri önbelleğe alırken şu adımları izleyin:
- TLS/SSL Kullanımı: Redis sunucusu ile uygulama arasındaki trafiği şifreleyin.
- Veri Maskeleme: Redis'e göndermeden önce veriyi uygulama katmanında şifreleyin (AES-256 gibi).
- ACL (Access Control List): Redis 6.0 ve üzeri sürümlerde kullanıcı bazlı yetkilendirme yaparak, uygulamanın sadece ihtiyacı olan anahtarlara erişmesini sağlayın.
İpucu: Üretim ortamındaFLUSHALLkomutunu asla kullanmayın. Bu komut tüm veritabanını siler ve sistemde ciddi bir performans kaybına (cache stampede) yol açar. Bunun yerine belirli anahtarları silmek içinDELveyaUNLINKkomutlarını tercih edin.
Sonuç
Node.js uygulamalarınızda Redis kullanarak hızlı önbellekleme yapmak, uygulamanızın performansını ve kullanıcı memnuniyetini doğrudan artıran stratejik bir hamledir. Cache-aside modelini uygulamak, veritabanı üzerindeki yükü minimize ederken, TTL yönetimi ile verilerinizin güncelliğini korumanızı sağlar.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce bağlantı havuzlarını (connection pooling), hata yönetimini ve veri gizliliği standartlarını (KVKK/GDPR) göz önünde bulundurarak test etmeniz gerekmektedir.
Bir sonraki adım olarak, Redis Pub/Sub mekanizmasını inceleyerek mikroservisler arası gerçek zamanlı iletişim kurmayı deneyebilirsiniz.

Yorumlar (0)
Yorum Yaz