Bir web sitesi her ziyaretçi geldiğinde aynı veritabanı sorgularını tekrar tekrar çalıştırır. Ana sayfadaki son yazılar, menüdeki kategoriler, kullanıcı ayarları, ürün fiyatları... Bunların çoğu saatlerce hatta günlerce değişmez, ama sunucu her istekte diske gidip MySQL'e sorar, sonucu hesaplar ve geri döner. Trafik arttıkça bu tekrar eden iş, veritabanını darboğaza sokar ve sayfa açılış süreleri uzar. İşte tam bu noktada Memcached devreye girer.
Memcached, sık kullanılan verileri RAM üzerinde tutan, dağıtık ve son derece hızlı bir bellek önbellekleme (in-memory caching) sistemidir. Mantığı basittir ama etkisi büyüktür: pahalı bir sorgunun sonucunu ilk seferinde hesaplayıp belleğe koyar, sonraki isteklerde veritabanına hiç dokunmadan doğrudan bellekten okur. Diskten yapılan bir MySQL sorgusu milisaniyeler sürerken, Memcached'ten okuma mikrosaniyeler seviyesindedir. Bu yazıda Memcached'in ne olduğunu, nasıl çalıştığını, WordPress ve uygulamalarda object cache olarak nasıl kullanıldığını ve sık karıştırıldığı Redis ile hangi noktalarda ayrıştığını, sistem yöneticisi gözüyle örneklerle anlatacağım.
Memcached Nedir ve Ne İşe Yarar#
Memcached, 2003 yılında LiveJournal'ın yük sorunlarını çözmek için geliştirilmiş, açık kaynaklı bir anahtar-değer (key-value) önbellek sunucusudur. "Değer" olarak bir string, bir sayı, serileştirilmiş bir dizi ya da bir nesne saklayabilirsiniz; "anahtar" ise bu değere ulaşmanızı sağlayan benzersiz bir metindir. Örneğin urun_fiyat_1024 anahtarıyla 1024 numaralı ürünün fiyatını saklarsınız, uygulamanız bir daha o fiyata ihtiyaç duyduğunda anahtarı verir ve değeri anında geri alır.
Buradaki kritik nokta, Memcached'in verileri yalnızca RAM'de tutmasıdır. Kalıcı bir depolama katmanı değildir; bir veritabanının ya da dosya sisteminin yerine geçmez. Görevi, asıl veri kaynağının önüne bir hızlandırıcı katman koymaktır. Diskten okuma yerine bellekten okuma yaptığınızda, yani veritabanı yükünün büyük kısmını kestiğinizde, aynı donanımla çok daha fazla eşzamanlı ziyaretçiye hizmet verebilirsiniz. Bu yüzden Memcached, yüksek trafikli haber siteleri, e-ticaret mağazaları, API'ler ve büyük WordPress kurulumları için standart bir performans aracıdır. WordPress hız optimizasyonu çalışmalarında object cache katmanı çoğu zaman Memcached ya da Redis ile kurulur.
Memcached'in bir diğer güçlü yanı dağıtık mimariye doğal uyumudur. Birden fazla Memcached sunucusunu bir havuz gibi kullanabilir, verileri istemci tarafında bir hash algoritmasıyla bu sunuculara dağıtabilirsiniz. Böylece önbellek kapasiteniz tek bir makinenin RAM'iyle sınırlı kalmaz; yeni sunucu ekleyerek yatay olarak büyürsünüz.
Memcached Nasıl Çalışır#
Çalışma prensibini anlamak için tipik bir "cache-aside" (önbellek yanında) desenini ele alalım. Uygulama bir veri isteyince önce Memcached'e sorar. Veri oradaysa (cache hit) doğrudan döner. Yoksa (cache miss) veritabanına gidilir, sonuç hesaplanır, hem kullanıcıya döndürülür hem de bir sonraki istek için Memcached'e yazılır. Akış, PHP tarafında kabaca şöyle görünür:
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
$key = 'anasayfa_son_yazilar';
$data = $mc->get($key);
if ($data === false) {
// Önbellekte yok: veritabanından çek
$data = $db->query("SELECT id, baslik FROM yazilar ORDER BY tarih DESC LIMIT 10")
->fetchAll();
// 5 dakika (300 sn) boyunca önbellekte tut
$mc->set($key, $data, 300);
}
// $data artık kullanıma hazır
Bu yaklaşımın güzelliği, aynı sorgunun beş dakika boyunca yalnızca bir kez çalışmasıdır. O süre içinde gelen yüzlerce istek veritabanına hiç dokunmaz. Karşılaştırma yapmak için, önbelleklenmemiş bir sorgu ile önbellekli çağrının maliyetini şöyle özetleyebiliriz:
| İşlem | Tipik gecikme | Veritabanı yükü |
|---|---|---|
| Diskten MySQL sorgusu | 5-50 ms | Yüksek |
Memcached'ten okuma (get) | 0.1-1 ms | Yok |
Memcached'e yazma (set) | 0.1-1 ms | Yok |
Memcached, belleği verimli kullanmak için slab allocation adı verilen bir yöntem uygular: RAM'i sabit boyutlu bloklara böler ve verileri boyutlarına göre uygun bloklara yerleştirir. Bellek dolduğunda ise LRU (Least Recently Used) politikasıyla en uzun süredir kullanılmayan kayıtları otomatik olarak siler. Yani önbelleği elle temizlemenize gerek kalmaz; yer açılması gerektiğinde en az işe yarayan veri kendiliğinden düşer. Her kaydın bir TTL (Time To Live) yani yaşam süresi vardır; bu süre dolduğunda veri geçersiz sayılır ve bir sonraki istekte tazelenir.
Memcached Kurulumu ve Yapılandırması#
Paylaşımlı bir hosting paketinde Memcached genellikle sağlayıcı tarafından hazır sunulur; sizin yalnızca uygulamanızın önbellek eklentisini etkinleştirmeniz yeterlidir. Kök erişiminizin olduğu bir VDS veya sanal sunucuda ise servisi kendiniz kurarsınız. Debian/Ubuntu tabanlı bir sistemde kurulum oldukça kısadır:
# Memcached sunucusu ve PHP istemci eklentisi
sudo apt update
sudo apt install memcached php-memcached
# Servisi başlat ve açılışta otomatik çalışmasını sağla
sudo systemctl enable --now memcached
# Çalıştığını doğrula
sudo systemctl status memcached
Yapılandırma dosyası Debian ailesinde /etc/memcached.conf altındadır. Buradaki en önemli iki ayar, servise ayıracağınız bellek miktarı ve dinleme adresidir:
# Önbelleğe ayrılan RAM (MB) — trafiğe göre artırın
-m 512
# Yalnızca yerel makineden erişim (güvenlik için kritik)
-l 127.0.0.1
# TCP portu (varsayılan)
-p 11211
# Aynı anda kabul edilecek maksimum bağlantı
-c 2048
Güvenlik açısından en kritik ayar -l 127.0.0.1 satırıdır. Memcached'in kimlik doğrulaması yoktur; portu tüm dünyaya açarsanız, sunucunuzdaki önbellek verisini herkes okuyabilir ve daha kötüsü, makineniz DDoS saldırılarında yansıtıcı olarak kullanılabilir. Bu yüzden servisi ya sadece localhost'a bağlayın ya da uygulama sunucularınızın bulunduğu iç ağa açıp bir güvenlik duvarı kuralıyla dışarıyı engelleyin. Sunucunuzu tek başınıza yönetmek istemiyorsanız sunucu yönetimi hizmetiyle bu sıkılaştırmaları uzman ekibe bırakabilirsiniz. Değişikliklerden sonra servisi yeniden başlatmayı unutmayın:
sudo systemctl restart memcached
Kurulumun doğru çalıştığını komut satırından hızlıca test edebilirsiniz:
# Bağlan ve istatistikleri iste
echo -e "stats\r\nquit\r\n" | nc 127.0.0.1 11211 | grep -E "curr_items|get_hits|get_misses"
Buradaki get_hits ve get_misses değerleri, önbelleğinizin ne kadar isabetli çalıştığını gösterir. İsabet oranınız (hits / (hits + misses)) yüzde 90'ların üzerindeyse önbellek işini iyi yapıyor demektir; düşükse ya TTL süreleriniz çok kısadır ya da ayrılan bellek yetersizdir.
WordPress ve Uygulama Object Cache Kullanımı#
Memcached'in en yaygın kullanım alanı, uygulamaların nesne önbelleği (object cache) katmanıdır. WordPress her sayfa yüklemesinde onlarca, bazen yüzlerce veritabanı sorgusu çalıştırır; ayarlar (options), gönderi meta verileri, kullanıcı bilgileri, terimler... Bunların çoğu tekrar tekrar okunur. WordPress'in kalıcı olmayan (persistent) bir object cache arka ucu takıldığında, bu okumalar istekler arasında bellekte saklanır ve veritabanı yükü ciddi biçimde düşer.
WordPress'te Memcached'i devreye almak için genellikle bir drop-in dosyası olan wp-content/object-cache.php ile bir eklenti (örneğin W3 Total Cache ya da bağımsız bir Memcached drop-in'i) kullanılır. Eklenti kurulduktan sonra sunucu bağlantısını wp-config.php içinde tanımlarsınız:
// wp-config.php içinde Memcached sunucu havuzu
$memcached_servers = array(
'default' => array(
'127.0.0.1:11211',
),
);
Bağlantıyı doğruladıktan sonra WP-CLI ile object cache'in gerçekten devrede olup olmadığını kontrol edebilirsiniz:
# Object cache durumu ve tipi
wp cache type
# Basit bir yaz-oku testi
wp cache set test_anahtari "merhaba" && wp cache get test_anahtari
Doğru kurulmuş bir object cache, yoğun bir WordPress ana sayfasındaki sorgu sayısını 120'lerden 20'lere, sayfa üretim süresini de örneğin 800 ms'den 250 ms'ye indirebilir. Bu iyileştirmenin en çok hissedildiği yer, admin paneli ve giriş yapmış kullanıcıların gördüğü dinamik sayfalardır; çünkü bu sayfalar tam sayfa önbelleğinden (page cache) yararlanamaz, ama object cache'ten fazlasıyla faydalanır.
Aynı mantık WooCommerce, Laravel, Symfony, Drupal ve Magento gibi platformlar için de geçerlidir. Laravel'de tek satırlık bir yapılandırmayla önbellek sürücüsünü Memcached'e çevirebilirsiniz:
# .env dosyasında
CACHE_DRIVER: memcached
MEMCACHED_HOST: 127.0.0.1
MEMCACHED_PORT: 11211
Yönetimli bir WordPress hosting paketinde object cache çoğunlukla önceden ayarlı gelir. Kendi altyapınızı web hosting ya da reseller planında kuruyorsanız, önbellek katmanını sitenizin trafiğine göre boyutlandırmanız performans açısından belirleyici olur.
Memcached ile Redis Karşılaştırması#
Memcached ve Redis, "bellekte veri tutan hızlı depolar" olarak sık sık aynı cümlede geçer, ama felsefeleri farklıdır. Memcached tek bir işi çok iyi yapmak için tasarlanmış sade bir önbellektir; Redis ise önbelleğin ötesinde veri yapıları, kalıcılık ve mesajlaşma sunan bir "veri yapıları sunucusudur". Redis nedir yazısında bu esnekliği ayrıntılı ele alıyoruz. Temel farkları şöyle özetleyebiliriz:
| Özellik | Memcached | Redis |
|---|---|---|
| Veri tipleri | Sadece anahtar-değer (string/blob) | String, liste, hash, set, sorted set, stream |
| Kalıcılık (disk) | Yok (yalnızca RAM) | Var (RDB anlık görüntü + AOF günlük) |
| Çoklu iş parçacığı | Çok iş parçacıklı (multi-threaded) | Ağırlıklı tek iş parçacıklı |
| Bellek yönetimi | Slab + LRU, sade | Daha esnek, yapılandırılabilir tahliye politikaları |
| Yatay ölçekleme | İstemci tarafı hash ile doğal | Redis Cluster ile |
| Ekstra yetenekler | Yok | Pub/Sub, işlem, Lua betikleri, TTL, atomik sayaçlar |
| Yeniden başlatma | Tüm veri kaybolur | Diskten geri yüklenebilir |
Bu tablodan çıkan pratik sonuç şudur: Memcached, saf ve büyük ölçekli önbellekleme için hâlâ mükemmel bir seçenektir. Çok iş parçacıklı yapısı sayesinde çok çekirdekli sunucularda yüksek eşzamanlılıkta bellekten okuma iş yükünü verimli dağıtır ve bellek başına daha az meta veri tutar; yani "sadece anahtar-değer önbelleği" senaryosunda RAM'i biraz daha tutumlu kullanır. Redis ise sayaçlar, kuyruklar, oturum yönetimi, oran sınırlama, gerçek zamanlı liderlik tabloları gibi veri yapısı gerektiren işlerde ve önbelleğin yeniden başlatmada kaybolmasını istemediğiniz durumlarda öne çıkar.
Hangi Durumda Hangisini Seçmeli#
Karar verirken kendinize birkaç soru sorun. Birincisi: Sakladığım şey sadece "geçici sonuç" mu, yoksa kaybolmaması gereken bir durum bilgisi mi? Eğer önbelleğiniz yalnızca hesaplanmış sorgu sonuçlarından oluşuyorsa ve bir yeniden başlatmada bunların yeniden hesaplanması sorun değilse, Memcached fazlasıyla yeterlidir. Ama oturum verisi, alışveriş sepeti ya da bir kuyruk tutuyorsanız ve bunların sunucu yeniden başladığında hayatta kalmasını istiyorsanız, kalıcılık sunan Redis daha güvenli bir tercihtir.
İkincisi: Anahtar-değer dışında bir veri yapısına ihtiyacım var mı? "Bir listeye eleman ekle", "bir sayacı atomik olarak artır", "bir kümeye üye olup olmadığını kontrol et" gibi işlemler yapıyorsanız Memcached'i bunlara zorlamak yerine Redis'in hazır yapılarını kullanmak hem daha basit hem daha güvenlidir. Buna karşılık ihtiyacınız gerçekten "büyük bir sorgu sonucunu belleğe koy, sonra hızlıca oku"dan ibaretse, ekstra özellikler için karmaşıklık eklemenin anlamı yoktur.
Üçüncü ve çok gözden kaçan konu, sağlayıcınızın hangisini desteklediğidir. Uygulamalarınızı hazır kurulumlarla denemek istiyorsanız App Center üzerinden Redis dâhil pek çok servisi tek tıkla ayağa kaldırabilir, ihtiyaçlarınızı karşılaştırabilirsiniz. Pek çok gerçek dünya mimarisinde ikisi bir arada da kullanılır: object cache için Memcached, oturum ve kuyruk için Redis. Doğru cevap "hangisi daha iyi" değil, "hangi iş için hangisi" sorusundadır.
Performans İpuçları ve Yaygın Hatalar#
Memcached'ten en iyi verimi almak için birkaç pratik kurala dikkat edin. Önce isabet oranınızı ölçün. get_hits ve get_misses istatistiklerini düzenli izleyin; oran düşükse ya belleği artırın ya da hangi verilerin önbelleklendiğini gözden geçirin. Boş yere önbelleğe girip her seferinde geçersiz kalan veriler, önbelleğin faydasını sıfırlar.
TTL sürelerini veriye göre seçin. Nadiren değişen site ayarları için uzun (saatlerce), sık güncellenen sepet toplamları için kısa (saniyeler) süreler mantıklıdır. Ayrıca veri değiştiğinde ilgili anahtarı elle geçersiz kılmayı ihmal etmeyin; örneğin bir yazı güncellendiğinde o yazının önbelleğini silin:
// Yazı güncellendiğinde ilgili önbelleği temizle
$mc->delete('yazi_' . $yaziId);
$mc->delete('anasayfa_son_yazilar');
Anahtar boyutu ve değer boyutu sınırlarını unutmayın. Memcached'te bir değer varsayılan olarak en fazla 1 MB olabilir; büyük nesneleri önbelleğe koymaya çalışmak set başarısızlığına yol açar. Çok büyük veriler için ya parçalayın ya da bu tür veriyi önbelleğe hiç almayın. Cache stampede (aynı anahtar aynı anda binlerce istekte geçersiz olup hepsi birden veritabanına yüklenmesi) sorununa karşı, popüler anahtarların TTL'lerine küçük rastgele farklar ekleyin ki hepsi aynı saniyede sönmesin.
Son olarak, önbellek katmanının önündeki web sunucusu tarafında da tam sayfa önbelleğini birlikte kurmak, object cache ile birleşince en iyi sonucu verir. Örneğin Nginx tarafında statik içerik için basit bir mikro-önbellek ekleyebilirsiniz:
# Nginx FastCGI mikro-önbellek (PHP çıktısını kısa süre sakla)
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=SITE:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
location ~ \.php$ {
fastcgi_cache SITE;
fastcgi_cache_valid 200 10m;
add_header X-Cache-Status $upstream_cache_status;
}
Memcached uygulama içi sorguları, Nginx mikro-önbelleği ise tüm sayfa çıktısını hızlandırır; ikisi birbirini tamamlar. Yedekleme ve sürüm güvenliği için de bu değişiklikleri devreye almadan önce yedekleme planınızın çalıştığından emin olun; bir yapılandırma hatası olursa geri dönmek kolay olsun.
Sıkça Sorulan Sorular#
Memcached verilerimi kalıcı olarak saklar mı?#
Hayır, saklamaz. Memcached tamamen RAM üzerinde çalışır ve diske hiçbir şey yazmaz. Servis yeniden başlatıldığında ya da sunucu kapandığında önbellekteki tüm veriler kaybolur. Bu bir kusur değil, tasarım tercihidir; çünkü Memcached'in görevi asıl veri kaynağını (veritabanınızı) değiştirmek değil, onun önünde geçici bir hızlandırıcı katman olmaktır. Kaybolmaması gereken veriler her zaman kalıcı bir depoda (veritabanı veya kalıcılık sunan Redis) tutulmalıdır.
Memcached'i açık kaynak kodlu bir siteye kurmak siteyi mutlaka hızlandırır mı?#
Genellikle hızlandırır, ama sihirli bir düğme değildir. Kazanç, sitenizin ne kadar veritabanı yoğun çalıştığına bağlıdır. Her istekte ağır sorgular üreten dinamik bir sitede object cache dramatik fark yaratır; buna karşılık zaten büyük ölçüde statik olan veya çok az veritabanı sorgusu yapan bir sitede fark sınırlı kalabilir. En doğru yaklaşım, kurulumdan önce ve sonra sayfa üretim süresini ve sorgu sayısını ölçüp gerçek etkisini görmektir.
Memcached güvenli midir, dışarıya açmalı mıyım?#
Memcached'in yerleşik bir kimlik doğrulama mekanizması yoktur, bu yüzden asla doğrudan internete açılmamalıdır. Servisi yalnızca 127.0.0.1 üzerinden ya da uygulama sunucularınızın bulunduğu özel iç ağ üzerinden erişilebilir yapın ve güvenlik duvarınızda 11211 portunu dışarıya kapatın. Aksi hâlde hem önbellek veriniz okunabilir hem de sunucunuz yansıtmalı DDoS saldırılarında kötüye kullanılabilir. Bu tür sıkılaştırmaları yönetmek istemiyorsanız sunucu yönetimi hizmeti almak mantıklı olur.
Memcached ile Redis'i aynı sunucuda birlikte kullanabilir miyim?#
Evet, birlikte kullanmak yaygın ve mantıklı bir mimaridir. Birçok proje, tekrar eden veritabanı sonuçları için object cache olarak Memcached'i, oturum yönetimi, kuyruklar ve atomik sayaçlar gibi kalıcılık veya veri yapısı gerektiren işler için Redis'i aynı anda çalıştırır. İkisi farklı portlarda çalıştığı için çakışmazlar. Yeterli RAM'iniz olduğu sürece bu ikili yaklaşım, her aracı en iyi olduğu işte kullanmanızı sağlar.
Önbelleğim doluysa ne olur, elle temizlemem gerekir mi?#
Elle temizlemenize gerek yoktur. Memcached'e ayrılan bellek dolduğunda, LRU (en uzun süredir kullanılmayan) politikasıyla en az işe yarayan kayıtları otomatik olarak siler ve yeni verilere yer açar. Ayrıca her kaydın bir yaşam süresi (TTL) vardır; süresi dolan veriler kendiliğinden geçersiz sayılır. Yani önbellek boyutunu sabit tutmak için sürekli bakım yapmanız gerekmez; sizin görevleriniz veri değiştiğinde ilgili anahtarları geçersiz kılmak ve isabet oranını ara sıra kontrol etmektir.
Paylaşımlı hostingimde Memcached var mı, nasıl anlarım?#
Bunu öğrenmenin en kolay yolu hosting sağlayıcınızın kontrol panelinden PHP eklentileri listesine bakmak ya da bir phpinfo() çıktısı alıp içinde "memcached" bölümünü aramaktır. Çoğu modern paylaşımlı ve yönetimli hosting planı ya Memcached'i ya da Redis'i hazır sunar; sizin yalnızca uygulamanızın object cache eklentisini etkinleştirip sunucu adresini girmeniz yeterli olur. Emin değilseniz destek ekibine sormaktan çekinmeyin, hangi önbellek katmanının kullanılabilir olduğunu ve nasıl bağlanacağınızı size iletirler.
Kapanış#
Memcached, karmaşık görünen "site hızlandırma" konusunun en sade ve en etkili araçlarından biridir: tekrar eden veritabanı sorgularını RAM'e taşıyıp yükü keserek aynı donanımla çok daha fazla ziyaretçiye akıcı bir deneyim sunmanızı sağlar. WordPress, WooCommerce ya da kendi yazdığınız bir uygulama fark etmeksizin, object cache katmanını doğru boyutlandırdığınızda sayfa süreleri kısalır, sunucu daha rahat nefes alır ve trafik zirvelerinde çökme riski azalır. Redis ile arasındaki farkı bilmek de doğru aracı doğru iş için seçmenizi kolaylaştırır.
Sitenizin gerçekten hızlı çalışması için altyapının da bu performansı destekleyebilmesi gerekir. Object cache dostu, güçlü altyapıya sahip web hosting ve yönetimli WordPress hosting planlarımızla ya da kök erişimiyle her şeyi kendiniz kurabileceğiniz sanal sunucu ve VDS çözümlerimizle Clou.TR yanınızda. Önbellekleme, güvenlik sıkılaştırması ve performans ayarlarını uzman ekibe bırakmak isterseniz sunucu yönetimi hizmetimize göz atın; sitenizi bir sonraki hız seviyesine birlikte taşıyalım.