1. Anasayfa
  2. Blog
  3. Teknoloji

Memcached ve Redis: Modern Önbellekleme Çözümleri

Memcached ve Redis: Modern Önbellekleme Çözümleri

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çeklenebilirlikMaliyet 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 TipleriString, 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çenekleriRDB (anlık görüntü) ve AOF (append-only file) ile verilerinizi diske yazabilirsiniz. Sistem yeniden başlatıldığında veriler kaybolmaz.
Pub/Sub MessagingGerçek zamanlı mesajlaşma sistemleri oluşturabilirsiniz. Chat uygulamaları, bildirim sistemleri için mükemmel.
Lua ScriptingKarmaşık işlemleri sunucu tarafında atomik olarak çalıştırabilirsiniz. Esneklik ve performans bir arada.
Replikasyon & ClusteringMaster-slave replikasyon ve Redis Cluster ile yüksek erişilebilirlik ve ölçeklenebilirlik sağlar.
Transaction DesteğiMULTI/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.

ÖzellikMemcachedRedis
Veri TipleriSadece string (basit anahtar-değer)String, List, Set, Hash, Sorted Set ve daha fazlası
ThreadingMulti-threaded (çok çekirdekli CPU’ları tam kullanır)Single-threaded (ancak son sürümlerde I/O threading desteği var)
KalıcılıkYok (sadece RAM’de, restart sonrası veriler kaybolur)RDB ve AOF ile disk’e yazma seçenekleri
ReplikasyonYok (client tarafında yönetilir)Master-slave replikasyon built-in
ClusteringClient-side shardingRedis Cluster ile native clustering
Pub/SubYokTam destekli pub/sub messaging
TransactionYokMULTI/EXEC ile transaction desteği
ScriptingYokLua scripting desteği
Memory YönetimiSlab allocation (daha öngörülebilir)jemalloc (daha esnek ama fragmantasyon riski)
Kullanım KolaylığıÇok basit, öğrenmesi kolayDaha 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: MemcachedGerç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

  1. Session Storage: Kullanıcı oturum bilgileri için ideal. Hızlı, basit ve kaybolursa kullanıcı tekrar login olur.
  2. Database Query Cache: Sık çalıştırılan SQL sorgu sonuçlarını saklamak için mükemmel.
  3. API Response Cache: Üçüncü parti API çağrılarının sonuçlarını geçici olarak saklamak.
  4. Fragment Cache: HTML parçacıklarını (rendered HTML) önbelleğe almak.

Gerçek Dünya Örnekleri: Redis

  1. Leaderboard/Sıralama: Sorted Set ile oyun skorları, en çok satanlar listesi.
  2. Real-time Analytics: HyperLogLog ile benzersiz ziyaretçi sayımı, oturum analizi.
  3. Rate Limiting: API isteklerini sınırlamak için counter ve TTL kullanımı.
  4. Queue Systems: List veri tipi ile iş kuyruğu (job queue) oluşturmak.
  5. 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.

Memcached - Redis Performans
  • 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 StratejileriFailover 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.

Editör Notu: İçeriğimiz okuyucu desteğiyle finanse edilmektedir. Bu, bağlantılarımızdan bazılarına tıkladığınızda komisyon kazanabileceğimiz anlamına gelir.

Burada sadece teorik bilgiler değil, gerçek deneyimlere dayanan pratik çözümler var. Burada yol arkadaşı olacağız. Karmaşık konuları birlikte çözecek, teknik detayları birlikte aşacağız...

Yazarın Profili