Web uygulamalarınız yavaş mı çalışıyor? Veritabanı sorguları performans düşüklüğüne mi neden oluyor? Günümüz yazılım geliştirme süreçlerinde yüksek performans ve ölçeklenebilirlik, başarılı bir dijital altyapının temel taşlarını oluşturur. Bu noktada veri işleme hızını artırmak ve sistem yükünü azaltmak için önbellekleme teknolojileri kritik rol oynar. En popüler ve sık tercih edilen iki önbellekleme çözümü olan Memcached ve Redis, geliştiricilere farklı avantajlar sunar. Bu rehberde, Memcached ile Redis arasındaki temel farkları, kullanım senaryolarını, avantajlarını ve hangi durumlarda hangisinin daha uygun olacağını detaylı şekilde ele alıyoruz.
Önbellekleme Nedir ve Neden Önemli?
Önbellekleme (caching), sık erişilen verileri geçici olarak daha hızlı erişilebilir bir konumda saklamak anlamına gelir. Düşünün ki her gün aynı yolu kullanarak işe gidiyorsunuz. Bir süre sonra o yolu ezberliyorsunuz ve GPS’e bakmadan gidebiliyorsunuz. İşte önbellekleme de tam olarak bunu yapıyor: sık kullanılan bilgileri “ezberleyerek” hızlı erişim sağlıyor.
| Performans Artışı | Ölçeklenebilirlik | Maliyet Optimizasyonu |
|---|---|---|
| Veritabanı sorgularını RAM’den okumak, diskten okumaya göre binlerce kat daha hızlı. Milisaniyeler kullanıcı deneyiminde devrim yaratır. | Veritabanı yükünü azaltarak daha fazla kullanıcıya hizmet verebilirsiniz. Mevcut altyapınızla daha çok iş çıkarırsınız. | Daha az sunucu kaynağı kullanarak aynı performansı elde edebilirsiniz. Bu da doğrudan maliyetlerinize yansır. |
Modern web uygulamalarında önbellekleme stratejisi olmazsa olmaz. E-ticaret sitelerinde ürün katalogları, sosyal medya platformlarında kullanıcı profilleri, haber sitelerinde içerik listeleri – hepsi önbellekleme sayesinde anında yükleniyor. Peki bu işi yapan iki dev: Memcached ve Redis arasında nasıl bir fark var?
Memcached: Basit ve Etkili Önbellekleme Çözümü
Memcached, 2003 yılında LiveJournal için geliştirilen, açık kaynaklı, yüksek performanslı bir bellek önbellekleme sistemi. Adı üzerinde: “memory cached” – bellekte önbellek. Temel felsefesi çok basit: anahtar-değer çiftlerini RAM’de saklamak ve bunlara ışık hızında erişim sağlamak.
Memcached’in güzelliği minimalist yaklaşımında gizli. Karmaşık özelliklerle boğuşmak yerine, tek bir işi – önbelleklemeyi – mükemmel şekilde yapar. Çoklu thread desteği sayesinde modern çok çekirdekli işlemcileri etkin kullanır ve gerçekten etkileyici performans sunar.
- Memcached’in temel özellikleri:
- Basit anahtar-değer deposu (key-value store)
- Çoklu thread mimarisi
- Veri tipi olarak sadece string desteği
- LRU (Least Recently Used) tahliye algoritması
- Dağıtık yapı desteği (distributed caching)
- Hafiflik ve hız odaklı tasarım
- Kimler Kullanıyor?
- Facebook, YouTube, Twitter, Wikipedia ve daha birçok dev platform Memcached’i yoğun şekilde kullanıyor. Bu siteler milyarlarca isteği işlerken Memcached’in sadeliğinden ve güvenilirliğinden faydalanıyor. Memcached sizi fantezi özelliklerle oyalamaz, işini yapar ve kenara çekilir.
Memcached özellikle oturum yönetimi (session management), veritabanı sorgu sonuçlarının önbelleklenmesi ve API yanıtlarının saklanması gibi basit önbellekleme ihtiyaçları için ideal. Eğer karmaşık veri yapılarına veya kalıcı depolamaya ihtiyacınız yoksa, Memcached harika bir seçim.
Redis: Çok Yetenekli Veri Yapıları Deposu
Redis (Remote Dictionary Server), 2009 yılında Salvatore Sanfilippo tarafından geliştirilen açık kaynaklı bir in-memory veri yapıları deposu. “Veri yapıları deposu” ifadesine dikkat edin – Redis sadece bir önbellek sistemi değil, tam teşekküllü bir veritabanı gibi çalışabilen güçlü bir araç.
| Zengin Veri Tipleri | String, List, Set, Sorted Set, Hash, Bitmap, HyperLogLog, Stream – Redis tam 10’dan fazla farklı veri yapısını destekler. Her biri farklı kullanım senaryoları için optimize edilmiş. |
| Kalıcılık Seçenekleri | RDB (anlık görüntü) ve AOF (append-only file) ile verilerinizi diske yazabilirsiniz. Sistem yeniden başlatıldığında veriler kaybolmaz. |
| Pub/Sub Messaging | Gerçek zamanlı mesajlaşma sistemleri oluşturabilirsiniz. Chat uygulamaları, bildirim sistemleri için mükemmel. |
| Lua Scripting | Karmaşık işlemleri sunucu tarafında atomik olarak çalıştırabilirsiniz. Esneklik ve performans bir arada. |
| Replikasyon & Clustering | Master-slave replikasyon ve Redis Cluster ile yüksek erişilebilirlik ve ölçeklenebilirlik sağlar. |
| Transaction Desteği | MULTI/EXEC komutlarıyla atomik işlemler yapabilirsiniz. Veri tutarlılığı garanti altında. |
Redis’in tek thread mimarisine rağmen bu kadar güçlü olması, olağanüstü optimize edilmiş kodundan kaynaklanıyor. Event-driven yapısı sayesinde aynı anda binlerce bağlantıyı verimli şekilde yönetebilir. Bu özellikler Redis’i sadece bir önbellek değil, gerçek zamanlı analitik, sıralama sistemleri, rate limiting ve daha birçok kullanım senaryosu için ideal hale getiriyor.
Memcached vs Redis: Detaylı Karşılaştırma
Şimdi asıl soruya gelelim: hangisini seçmeliyiz? İkisi de RAM tabanlı önbellekleme çözümleri ama yaklaşımları oldukça farklı. Bu karşılaştırma size doğru kararı vermenizde yardımcı olacak.
| Özellik | Memcached | Redis |
|---|---|---|
| Veri Tipleri | Sadece string (basit anahtar-değer) | String, List, Set, Hash, Sorted Set ve daha fazlası |
| Threading | Multi-threaded (çok çekirdekli CPU’ları tam kullanır) | Single-threaded (ancak son sürümlerde I/O threading desteği var) |
| Kalıcılık | Yok (sadece RAM’de, restart sonrası veriler kaybolur) | RDB ve AOF ile disk’e yazma seçenekleri |
| Replikasyon | Yok (client tarafında yönetilir) | Master-slave replikasyon built-in |
| Clustering | Client-side sharding | Redis Cluster ile native clustering |
| Pub/Sub | Yok | Tam destekli pub/sub messaging |
| Transaction | Yok | MULTI/EXEC ile transaction desteği |
| Scripting | Yok | Lua scripting desteği |
| Memory Yönetimi | Slab allocation (daha öngörülebilir) | jemalloc (daha esnek ama fragmantasyon riski) |
| Kullanım Kolaylığı | Çok basit, öğrenmesi kolay | Daha fazla özellik = daha fazla öğrenme eğrisi |
Görüldüğü gibi, Memcached sadelik ve ham performans için optimize edilmişken, Redis çok yönlülük ve gelişmiş özellikler sunuyor. Ancak unutmayın: daha fazla özellik her zaman daha iyi demek değil. Bazen en basit çözüm en iyi çözümdür.
Temel Özellik Karşılaştırması: Uygulama Örnekleri
| Memcached Kullanımına Uygun Senaryolar: | Redis Kullanımına Uygun Senaryolar: |
|---|---|
| -Dinamik web sayfalarının önbelleğe alınması -API yanıtlarının hızlı önbelleğe alınması -Veritabanı sorgularının azaltılması | -E-ticaret sitelerinde alışveriş sepeti yönetimi -Gerçek zamanlı analiz ve sıralama sistemleri -Chat uygulamaları -Oturum yönetimi ve kimlik doğrulama |
Memcached ile PHP önbellekleme nasıl yapılır?
1. Gerekli Paketlerin Kurulumu
A) Memcached Sunucusunu Yükleyin
Ubuntu/Debian:
sudo apt update
sudo apt install memcached
CentOS/RHEL:
sudo yum install memcached
Başlat:
sudo systemctl start memcached
sudo systemctl enable memcached
B) PHP için Memcached Eklentisini Kurun
Ubuntu:
sudo apt install php-memcached
Yükleme sonrası Apache ya da PHP-FPM’yi yeniden başlatın:,
sudo systemctl restart apache2
veya
sudo systemctl restart php8.1-fpm
2. PHP ile Temel Memcached Kullanımı
PHP’de Memcached sınıfı ile bağlantı kurup veri ekleme ve alma işlemleri oldukça basittir. Örnek Kod:
<?php
// Memcached nesnesi oluştur
$memcache = new Memcached();
$memcache->addServer('127.0.0.1', 11211);
// Önbelleğe veri yaz
$memcache->set('kullanici_adi', 'webuzman', 3600); // 3600 saniye = 1 saat
// Önbellekten veri oku
$kullanici = $memcache->get('kullanici_adi');
if ($kullanici) {
echo "Önbellekten gelen veri: " . $kullanici;
} else {
echo "Veri bulunamadı.";
}
?>
3. Laravel veya WordPress ile Kullanım (Opsiyonel)
Laravel ile Memcached:
- .env dosyasına ekleyin:
CACHE_DRIVER=memcached MEMCACHED_HOST=127.0.0.1
- config/cache.php içinde yapılandırma:
'memcached' => [
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => 11211,
'weight' => 100,
],
],
],
WordPress ile Memcached:
- Bir caching eklentisi (örn: W3 Total Cache) kullanın.
- W3TC ayarlarında Memcached’i etkinleştirin (Object Cache veya Page Cache olarak).
- Sunucuda Memcached kurulu olmalı ve WordPress tarafından erişilebilir olmalıdır.
Hangi Durumda Hangisini Kullanmalısınız?
Teoride her şey güzel görünüyor, ancak pratikte ne zaman Memcached, ne zaman Redis kullanmalısınız? İşte size gerçek dünya senaryoları ve öneriler.
- Memcached Kullanın:
- Basit anahtar-değer önbellekleme yeterli
- Veriler kaybolsa da sorun değil (ephemeral data)
- Çok yüksek işlem hacmi var ve multi-core CPU’dan tam faydalanmak istiyorsunuz
- Horizontal ölçekleme kolay ve client-side sharding kabul edilebilir
- Minimal özellik seti yeterli, karmaşıklıktan kaçınmak istiyorsunuz
- Redis Kullanın:
- Liste, set, hash gibi karmaşık veri yapılarına ihtiyaç var
- Veri kalıcılığı önemli (persistence gerekli)
- Pub/sub, stream gibi gerçek zamanlı özellikler lazım
- Transaction ve atomik işlemler kritik
- Lua scripting ile özel logic uygulamak istiyorsunuz
- Built-in replikasyon ve clustering gerekli
| Gerçek Dünya Örnekleri: Memcached | Gerçek Dünya Örnekleri: Redis |
|---|---|
| – Session Storage: Kullanıcı oturum bilgileri için ideal. Hızlı, basit ve kaybolursa kullanıcı tekrar login olur. – Database Query Cache: Sık çalıştırılan SQL sorgu sonuçlarını saklamak için mükemmel. – API Response Cache: Üçüncü parti API çağrılarının sonuçlarını geçici olarak saklamak. – Fragment Cache: HTML parçacıklarını (rendered HTML) önbelleğe almak. | – Leaderboard/Sıralama: Sorted Set ile oyun skorları, en çok satanlar listesi. – Real-time Analytics: HyperLogLog ile benzersiz ziyaretçi sayımı, oturum analizi. – Rate Limiting: API isteklerini sınırlamak için counter ve TTL kullanımı. – Queue Systems: List veri tipi ile iş kuyruğu (job queue) oluşturmak. – Chat/Messaging: Pub/Sub ile gerçek zamanlı bildirim sistemleri. |
Gerçek Dünya Örnekleri: Memcached
- Session Storage: Kullanıcı oturum bilgileri için ideal. Hızlı, basit ve kaybolursa kullanıcı tekrar login olur.
- Database Query Cache: Sık çalıştırılan SQL sorgu sonuçlarını saklamak için mükemmel.
- API Response Cache: Üçüncü parti API çağrılarının sonuçlarını geçici olarak saklamak.
- Fragment Cache: HTML parçacıklarını (rendered HTML) önbelleğe almak.
Gerçek Dünya Örnekleri: Redis
- Leaderboard/Sıralama: Sorted Set ile oyun skorları, en çok satanlar listesi.
- Real-time Analytics: HyperLogLog ile benzersiz ziyaretçi sayımı, oturum analizi.
- Rate Limiting: API isteklerini sınırlamak için counter ve TTL kullanımı.
- Queue Systems: List veri tipi ile iş kuyruğu (job queue) oluşturmak.
- Chat/Messaging: Pub/Sub ile gerçek zamanlı bildirim sistemleri.
📌 Bazen her ikisini de birlikte kullanabilirsiniz! Örneğin basit session cache için Memcached, karmaşık iş mantığı için Redis. Araçları doğru işler için kullanın.
Performans ve Ölçeklenebilirlik Kıyaslaması
Sayılarla konuşalım. Hem Memcached hem Redis inanılmaz hızlı, ancak hangi senaryolarda hangisi öne çıkıyor? Benchmark testleri ve gerçek dünya deneyimleri bize değerli bilgiler sunuyor.

- Multi-Core Performansı- Memcached çoklu CPU çekirdeğini tam anlamıyla kullanabiliyor çünkü multi-threaded. Eğer 16 çekirdekli bir sunucunuz varsa, Memcached bunların hepsini kullanabilir. Redis ise traditionally single-threaded olduğu için tek bir çekirdekle sınırlı – ancak Redis 6.0’dan itibaren I/O işlemleri için multi-threading desteği geldi. Yine de ana event loop tek thread’de çalışıyor.
- Pratik sonuç: Çok yüksek throughput gerekiyorsa ve basit key-value yeterliyse, Memcached hafif avantajlı. Ancak Redis’in tek thread yapısı da çoğu uygulama için yeterince hızlı – ve zaten bottleneck genelde ağ veya disk I/O oluyor.
- Memory Kullanımı ve Efficiency– Redis genelde aynı veriyi saklamak için Memcached’den biraz daha fazla bellek kullanır. Bunun nedeni zengin veri yapıları ve ekstra metadata. Ancak fark çok dramatik değil – genelde %10-20 arası. Redis’in jemalloc kullanması zaman içinde memory fragmentation’a yol açabilir, bu yüzden düzenli monitoring önemli.
| Ölçekleme Stratejileri | Failover ve High Availability |
|---|---|
| — Memcached: Client-side consistent hashing ile horizontal scaling. Basit ama etkili. Yeni node eklemek kolay. — Redis: Redis Cluster ile native sharding veya Sentinel ile high availability. Daha karmaşık setup ama daha güçlü özellikler. | — Memcached: Bir node düşerse, o node’daki cache kaybolur. Client kütüphaneleri bunu handle eder ve diğer node’lara yönlendirir. — Redis: Redis Sentinel ile otomatik failover, master-slave replikasyon ile veri güvenliği. Production için daha robust. |
Memcached Kurulumu ve Kullanımı
# Memcached kurulumu
sudo apt-get update
sudo apt-get install memcached libmemcached-tools
# Servisi başlatma
sudo systemctl start memcached
sudo systemctl enable memcached
# Durum kontrolü
sudo systemctl status memcached
Memcached varsayılan olarak 11211 portunda çalışır ve localhost’tan erişime izin verir. Konfigürasyon dosyası /etc/memcached.conf içinde.
⭐ Python ile Memcached kullanımı:
from pymemcache.client import base
# Client oluştur
client = base.Client(('localhost', 11211))
# Veri yazma (key, value, expire_time_seconds)
client.set('user:1001', 'John Doe', expire=3600)
# Veri okuma
user = client.get('user:1001')
print(user) # b'John Doe'
# Veri silme
client.delete('user:1001')
# Birden fazla key ile çalışma
client.set_many({'key1': 'value1', 'key2': 'value2'})
result = client.get_many(['key1', 'key2'])
Redis Kurulumu ve Kullanımı
# Redis kurulumu
sudo apt-get update
sudo apt-get install redis-server
# Servisi başlatma
sudo systemctl start redis-server
sudo systemctl enable redis-server
# Redis CLI ile bağlanma
redis-cli
# Test
127.0.0.1:6379> ping
PONG
⭐ Python ile Redis kullanımı:
import redis
# Client oluştur
r = redis.Redis(host='localhost', port=6379, db=0)
# Basit string işlemleri
r.set('user:1001', 'John Doe', ex=3600) # ex=expire seconds
user = r.get('user:1001')
print(user) # b'John Doe'
# Hash kullanımı
r.hset('user:1001', mapping={
'name': 'John Doe',
'email': 'john@example.com',
'age': 30
})
email = r.hget('user:1001', 'email')
# List işlemleri (queue için ideal)
r.lpush('tasks', 'task1', 'task2', 'task3')
task = r.rpop('tasks')
# Set işlemleri (unique değerler)
r.sadd('tags:python', 'web', 'backend', 'api')
members = r.smembers('tags:python')
# Sorted Set (leaderboard için ideal)
r.zadd('scores', {'player1': 100, 'player2': 250, 'player3': 180})
top_players = r.zrevrange('scores', 0, 2, withscores=True)
📌 Pro tip: Production’da connection pooling kullanın. Her istek için yeni connection açmak maliyetli. Hem pymemcache hem redis-py connection pooling destekler.
Dikkat Edilmesi Gerekenler
Önbellekleme sistemleri güçlü araçlar ama yanlış kullanıldığında başınızı ağrıtabilir. İşte dikkat edilmesi gerekenler:
- Cache Invalidation Stratejisi– Phil Karlton’ın ünlü sözü: “Bilgisayar biliminde sadece iki zor şey var: cache invalidation ve isimlendirme.” Cache’i ne zaman temizleyeceğinizi bilmek kritik. TTL (Time To Live) kullanın, ancak gerçek zamanlılık gereken yerlerde manuel invalidation yapmayı unutmayın.
- Cache Stampede Önleme– Popüler bir cache key expire olduğunda, yüzlerce istek aynı anda veritabanına koşar. Bunu önlemek için “cache lock” veya “probabilistic early expiration” teknikleri kullanın.
- Serialization Dikkatli Seçin– JSON basit ama yavaş, pickle hızlı ama Python’a özel, msgpack hem hızlı hem cross-platform. Kullanım durumunuza göre seçin. Redis’de native veri tipleri kullanmak genelde en hızlısı.
- Memory Limitleri Ayarlayın– Hem Memcached hem Redis için memory limitleri belirleyin. Memcached’de -m parametresi, Redis’de maxmemory direktifi. Eviction policy olarak Redis’de genelde allkeys-lru veya volatile-lru kullanın.
- Monitoring ve Alerting– Hit rate, memory usage, eviction count gibi metrikleri izleyin. Hit rate %80’in altına düşüyorsa cache stratejinizi gözden geçirin. Redis için redis-cli –stat, Memcached için stats komutu kullanışlı.
- Security– Her iki sistem de varsayılan olarak authentication gerektirmez. Production’da Redis için requirepass, firewall kuralları ve bind address ayarlarını mutlaka yapın. Memcached için SASL authentication kullanabilirsiniz.
Sık Yapılan Hatalar:
- ❌ Her şeyi cache’lemeye çalışmak: Cache büyüdükçe hit rate düşer, memory maliyeti artar. Sadece gerçekten faydalı şeyleri cache’leyin.
- ❌ TTL’yi çok uzun tutmak: Stale data kullanıcı deneyimini bozar. Veri ne kadar sık değişiyorsa TTL o kadar kısa olmalı.
- ❌ Error handling yapmamak: Cache sunucusu düştüğünde uygulamanız çökmemeli. Graceful degradation yapın.
- ❌ Cache warmup yapmamak: Sistem yeniden başladığında cache soğuktur. Kritik dataları önceden yükleyin.
- ❌ Large values saklamak: Çok büyük objeler (>1MB) cache’lemek hem bellek hem de network açısından maliyetli. Parçalayın veya reference kullanın.
- ❌ Hot key problem’ini görmezden gelmek: Bir key çok sık erişiliyorsa single point of bottleneck olur. Caching proxy veya replication kullanın.
Hibrit Yaklaşım da Bir Seçenek
Birçok büyük platform ikisini de birlikte kullanıyor. Örneğin: Memcached ile session cache, Redis ile real-time features. Her aracı en iyi olduğu işler için kullanmak akıllıca. Ancak bu complexity getirir – gerçekten gerekmedikçe tek sistem ile başlamak daha sağlıklı.
- Başlangıç Aşaması– Önce Redis ile başlayın. Daha çok yönlü ve öğrenme eğrisi zaten aşmanız gereken bir şey. İlerleyen zamanlarda gerekirse Memcached eklersiniz.
- Scale Aşaması– Milyon kullanıcıya ulaştığınızda profiling yapın. Hangi cache operasyonları CPU’yu yakıyor? Basit key-value için Memcached, karmaşık işler için Redis.
- Enterprise Aşaması– Dedicated cache cluster’ları, advanced monitoring, disaster recovery planları. Redis Enterprise veya Amazon ElastiCache gibi managed service’lere bakın.
