Bir web uygulamasının en yavaş adımı çoğu zaman veritabanına gidip gelmektir. Her sayfa isteğinde aynı kategori listesini, aynı ayar tablosunu, aynı kullanıcı profilini tekrar tekrar MySQL'den çekmek sunucunun en pahalı işidir. Oysa bu verilerin büyük bölümü saniyeler, hatta dakikalar boyunca hiç değişmez. İşte Memcached tam da bu israfı ortadan kaldırmak için tasarlanmış, son derece basit ama etkili bir araçtır: sık kullanılan sonuçları RAM'de anahtar-değer çiftleri olarak tutar, uygulama aynı veriyi bir daha isterse veritabanına hiç dokunmadan doğrudan bellekten döner.
Yıllardır Facebook, YouTube, Wikipedia gibi devasa siteler tarafından kullanılan Memcached, dağıtılmış bir bellek önbelleği olarak öne çıkar. Kurulumu dakikalar sürer, yapılandırması avuç içi kadardır ve doğru kullanıldığında bir veritabanı sunucusunun yükünü belirgin biçimde aşağı çeker. Bu rehberde Memcached'in ne işe yaradığını, anahtar-değer modelinin nasıl çalıştığını, Ubuntu ve AlmaLinux üzerinde kurulumunu, en kritik güvenlik adımı olan dinleme adresini localhost'a kilitlemeyi, PHP ve WordPress ile kullanımını ve sık sorulan "Redis mi Memcached mi" sorusunun net cevabını uygulamalı örneklerle anlatacağım.
Memcached Nedir ve Ne İşe Yarar#
Memcached, verileri diskte değil doğrudan sunucunun belleğinde (RAM) saklayan, dağıtılmış bir anahtar-değer önbellek sistemidir. Amacı bir veritabanının yerini almak değil, veritabanının önünde bir tampon görevi görmektir. Uygulamanız pahalı bir sorgu çalıştırdığında sonucu Memcached'e "şu anahtarla sakla" der; bir sonraki istekte önce Memcached'e bakar, veri oradaysa MySQL hiç çalışmaz. Bu desende Memcached "cache-aside" (kenardan önbellek) mantığıyla kullanılır ve uygulamanın kontrolü tamamen sizde kalır.
Memcached'in felsefesi sadeliktir. Yalnızca metin ve ikili blob (byte dizisi) tutar; listeler, kümeler, sıralı yapılar gibi karmaşık veri tipleri yoktur. Veriyi kalıcı olarak saklamaz, disk yazmaz; servis yeniden başlarsa önbellek boşalır. Bellek dolduğunda en az kullanılan (LRU) kayıtları atarak yer açar. Tam da bu "kaybedilebilir veri" varsayımı sayesinde inanılmaz hızlı ve öngörülebilir kalır; bir kayıt kaybolsa bile uygulama veritabanından yeniden okur ve tekrar yazar.
Pratikte Memcached şu senaryolarda parlar: ürün ve kategori listeleri gibi sık okunan ama seyrek değişen veriler, ağır rapor ve toplulaştırma sorgularının sonuçları, oturum bilgileri, API yanıt gövdeleri ve WordPress gibi CMS'lerin nesne önbelleği. Buna karşılık ödeme durumu, stok sayacı gibi her an tutarlı olması gereken kritik verileri asıl kaynak olarak Memcached'te tutmak yanlış olur; orada Memcached yalnızca hızlandırıcı, MySQL ise tek doğruluk kaynağıdır.
Memcached Nasıl Çalışır (Anahtar-Değer Bellek Modeli)#
Memcached'in tüm dünyası bir dev sözlükten ibarettir: her kaydın bir anahtarı (en fazla 250 karakter) ve bu anahtara bağlı bir değeri (varsayılan olarak en çok 1 MB) vardır. Uygulama set, get, delete gibi birkaç temel komutla bu sözlüğe yazar ve okur. Her kayda bir de sona erme süresi (TTL) verirsiniz; süre dolduğunda kayıt otomatik geçersiz sayılır. Bu kadar basit bir API'nin bu kadar güçlü olmasının sırrı, her işlemin bellekte O(1) hızında tamamlanmasıdır.
Uygulama tarafındaki tipik akış şöyledir: önce anahtarla önbelleğe bak, veri varsa (hit) onu kullan; yoksa (miss) veritabanından çek, sonucu bir TTL ile önbelleğe yaz ve döndür. Aşağıdaki sözde kod bu "cache-aside" desenini özetler.
veri = memcached.get("urun_listesi_kategori_5")
eğer veri boşsa:
veri = veritabani.sorgula("SELECT ... WHERE kategori = 5")
memcached.set("urun_listesi_kategori_5", veri, ttl=300) # 5 dakika
döndür veri
Memcached bir de "dağıtılmış" olmasıyla ölçeklenir. Birden fazla Memcached sunucunuz varsa istemci kütüphanesi, anahtarın hash değerine göre her kaydı hangi sunucuya yazacağını kendi hesaplar; sunucular birbirinden habersizdir. Böylece 4 sunucuya 4 katı bellek elde edersiniz ve biri düşerse yalnızca ondaki kayıtlar kaybolur. Belleği dolduğunda ise LRU algoritması en uzun süredir dokunulmayan kayıtları temizleyerek yer açar. Bu yüzden Memcached'e verdiğiniz her şeyin orada kalacağını garanti sayamazsınız; bu bir zayıflık değil, tasarımın bilinçli bir tercihidir.
Memcached Kurulumu (Ubuntu ve AlmaLinux)#
Kurulum çoğu Linux dağıtımında paket deposundan tek komutla yapılır. Ubuntu ya da Debian tabanlı bir sunucuda hem servisi hem de PHP'nin konuşabilmesi için gerekli uzantıyı kuralım:
# Ubuntu / Debian
sudo apt update
sudo apt install memcached libmemcached-tools php-memcached -y
# Servisi başlat ve açılışta otomatik başlaması için etkinleştir
sudo systemctl enable --now memcached
sudo systemctl status memcached
AlmaLinux, Rocky Linux ya da RHEL tabanlı bir sistemde paket adları biraz farklıdır:
# AlmaLinux / Rocky / RHEL
sudo dnf install memcached libmemcached php-pecl-memcached -y
sudo systemctl enable --now memcached
Ana yapılandırma dosyası Debian ailesinde /etc/memcached.conf, RHEL ailesinde /etc/sysconfig/memcached içindedir. En çok dokunacağınız iki ayar bellek miktarı ve dinleme adresidir. Debian tarafındaki /etc/memcached.conf dosyasında satırlar tek tire ile başlayan bayraklardır:
# Önbellek için ayrılacak bellek (MB) — varsayılan 64, ihtiyaca göre artırın
-m 256
# Dinlenecek TCP portu (standart)
-p 11211
# ÇOK ÖNEMLİ: yalnızca yerel makineyi dinle (güvenlik bölümüne bakın)
-l 127.0.0.1
# Aynı anda kabul edilecek maksimum bağlantı sayısı
-c 1024
# Servisi çalıştıracak kullanıcı
-u memcache
Değişiklikten sonra servisi yeniden başlatın ve gerçekten dinlediğini doğrulayın:
sudo systemctl restart memcached
# 11211 portunun yalnızca 127.0.0.1'de açık olduğunu kontrol edin
sudo ss -tlnp | grep 11211
# Çalıştığını hızlıca test edin
echo -e "stats\r" | nc 127.0.0.1 11211 | head -n 15
stats çıktısında curr_items, get_hits, get_misses gibi satırları görüyorsanız Memcached ayakta demektir. Bu istatistiklere daha sonra performans ayarı yaparken sık başvuracağız. Kurulumun bu haliyle çalışması için sunucunuzda yeterli boş RAM bulunması gerekir; paylaşımlı bir hosting yerine kaynakları size ait bir VDS sunucu üzerinde Memcached çok daha rahat nefes alır.
Dinleme Adresini localhost'a Kilitlemek (Güvenlik)#
Memcached ile ilgili en önemli tek güvenlik kuralı şudur: kimlik doğrulaması yoktur. Standart yapılandırmada Memcached'e bağlanabilen herkes içindeki tüm veriyi okuyabilir, silebilir ve yazabilir. Bu yüzden servisin dış dünyaya açık olması felaketle sonuçlanır. Yıllar önce internete açık bırakılan on binlerce Memcached sunucusu hem veri sızıntısına yol açtı hem de dev boyutlu DDoS saldırılarında "yansıtıcı" olarak kötüye kullanıldı. Bu tabloya düşmemenin yolu, servisi yalnızca yerel makineye kilitlemektir.
İlk ve en kritik adım dinleme adresini 127.0.0.1 yapmaktır. Yapılandırmada -l 127.0.0.1 satırının bulunduğundan (ve -l 0.0.0.0 gibi tehlikeli bir değere ayarlı olmadığından) emin olun. Uygulama sunucusu ve Memcached aynı makinedeyse başka hiçbir şeye gerek yoktur; PHP localhost üzerinden bağlanır, dış dünya hiçbir şekilde porta ulaşamaz. UDP protokolünü kullanmıyorsanız onu da kapatmak saldırı yüzeyini daraltır:
# Sadece yerel arayüzü dinle
-l 127.0.0.1
# UDP'yi tamamen kapat (0 = kapalı) — DDoS yansıması riskini yok eder
-U 0
İkinci savunma katmanı güvenlik duvarıdır. Memcached ile uygulama farklı sunuculardaysa bile portu tüm dünyaya açmak yerine yalnızca uygulama sunucusunun IP adresine izin verin. Aşağıda hem UFW hem de firewalld örneği var:
# UFW (Ubuntu) — 11211'i yalnızca uygulama sunucusuna aç
sudo ufw allow from 10.0.0.5 to any port 11211 proto tcp
# firewalld (AlmaLinux) — belirli kaynağa zengin kural
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="11211" protocol="tcp" accept'
sudo firewall-cmd --reload
Farklı sunucular arasında gerçekten kimlik doğrulaması gerekiyorsa Memcached'in SASL desteğini etkinleştirebilirsiniz, ancak çoğu kurulumda en temiz ve en güvenli çözüm Memcached'i uygulamayla aynı makinede tutup 127.0.0.1'e kilitlemektir. Sunucu tarafı sıkılaştırma konusunda daha kapsamlı bir kontrol listesi için sunucu yönetimi hizmetimize göz atabilir, temel prensipleri ise dahili rehberlerimizden takip edebilirsiniz. Kural nettir: dışa açık, parolasız bir Memcached asla olmamalı.
PHP ile Memcached Kullanımı#
PHP tarafında php-memcached uzantısı (dikkat: sonundaki "d" ile, daha yeni ve önerilen olanı) size Memcached sınıfını verir. Önce uzantının yüklü olduğunu doğrulayın:
php -m | grep memcached
Uzantı listede görünüyorsa kullanmaya hazırsınız. Aşağıdaki örnek klasik cache-aside desenini gösterir: önce önbelleğe bakılır, veri yoksa "veritabanından" alınıp bir TTL ile yazılır.
<?php
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
$anahtar = 'anasayfa_urunler_v1';
$veri = $mc->get($anahtar);
if ($mc->getResultCode() === Memcached::RES_NOTFOUND) {
// Önbellekte yok — pahalı sorguyu çalıştır
$veri = agirVeritabaniSorgusu(); // örnek: SELECT ...
// 300 saniye (5 dakika) boyunca sakla
$mc->set($anahtar, $veri, 300);
}
echo "Ürün sayısı: " . count($veri);
Burada birkaç iyi alışkanlık öne çıkar. Anahtar isimlerine bir sürüm eki (_v1) koymak, veri yapısını değiştirdiğinizde eski önbelleği topluca geçersiz kılmayı kolaylaştırır. TTL değerini verinin ne sıklıkla değiştiğine göre seçin: dakikada değişen veriye 60 saniye, günde bir güncellenen listeye birkaç saat verin. Veri değiştiğinde ilgili anahtarı elle silmeyi de ($mc->delete($anahtar)) unutmayın; buna "cache invalidation" denir ve önbelleğin bayat veri döndürmesini engeller.
Oturumları Memcached'te tutmak da yaygın bir kullanımdır ve php.ini üzerinden birkaç satırla açılır:
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
Bu ayar özellikle birden fazla web sunucusunu bir yük dengeleyici arkasında çalıştırdığınızda değerlidir: kullanıcının oturumu tek bir sunucuya bağlı kalmaz, tüm sunucular aynı Memcached'ten okur. Yalnız şunu aklınızda tutun; Memcached kalıcı değildir, servis yeniden başlarsa açık oturumlar düşebilir, bu da kullanıcıların yeniden giriş yapması demektir.
WordPress'te Memcached Object Cache#
WordPress her sayfa yüklemesinde ayarlar tablosunu, menüleri ve pek çok küçük sorguyu tekrar tekrar çalıştırır. WordPress'in içinde zaten bir "object cache" mekanizması vardır ama varsayılan olarak yalnızca tek istek boyunca çalışır; istek bittiğinde her şey unutulur. Bir "persistent object cache" eklentisi kurarak bu önbelleği Memcached'e taşırsanız, veriler istekler arasında bellekte kalır ve veritabanı yükü belirgin biçimde düşer.
Kullanım oldukça basittir: uyumlu bir nesne önbelleği drop-in dosyası (object-cache.php) wp-content dizinine yerleştirilir. Birçok eklenti bunu tek tıkla yapar; elle kuruyorsanız akış şöyledir:
# php-memcached uzantısının kurulu olduğundan emin olun
php -m | grep memcached
# Uyumlu object-cache.php drop-in dosyasını wp-content'e kopyalayın
cp object-cache.php /var/www/site/wp-content/object-cache.php
Bazı kurulumlarda wp-config.php içinde önbellek anahtarlarının siteler arasında çakışmaması için bir tuz tanımlamanız istenir:
// wp-config.php — birden fazla WordPress aynı Memcached'i paylaşıyorsa şart
define('WP_CACHE_KEY_SALT', 'site1_');
Kurulumdan sonra stats çıktısındaki get_hits / get_misses oranından önbelleğin gerçekten çalıştığını doğrulayın; sağlıklı bir sitede hit oranı zamanla yüzde 90'ların üzerine çıkar. WordPress'i hem nesne önbelleği hem de tam sayfa önbelleğiyle katmanlamak en iyi sonucu verir. Nesne önbelleği için Memcached'e alternatif olarak Redis'i de düşünebilirsiniz; ikisinin ayrımını bir sonraki bölümde ve ayrıntılı olarak Redis nedir rehberimizde bulacaksınız. Hazır ve hızlı bir başlangıç için WordPress hosting paketleri önbellek altyapısıyla birlikte gelir.
Memcached ve Redis Karşılaştırması#
"Memcached mi Redis mi" sorusu bir web sunucusunda en sık tartışılan konulardan biridir ve doğrusu çoğu senaryoda ikisi de işi görür. Yine de aralarında, seçimi belirleyen net farklar vardır. Memcached tek amaçlı bir bellek önbelleğidir: yalnızca basit anahtar-değer saklar, çok basittir ve çok çekirdekli sunucularda yüksek eşzamanlılıkta biraz daha iyi ölçeklenebilir. Redis ise "veri yapısı sunucusudur"; liste, küme, sıralı küme, hash ve sayaç gibi zengin tipler sunar, veriyi diske yazıp kalıcı yapabilir, yayınla-abone ol (pub/sub) ve atomik işlemler gibi yetenekler taşır.
Aşağıdaki tablo temel farkları özetler.
| Özellik | Memcached | Redis |
|---|---|---|
| Veri tipleri | Yalnız anahtar-değer (metin/blob) | String, liste, küme, hash, sorted set |
| Kalıcılık (disk) | Yok — yalnızca bellekte | Var (RDB/AOF ile diske yazar) |
| Maksimum değer boyutu | Varsayılan 1 MB | 512 MB'a kadar |
| Çok çekirdek kullanımı | Doğal çok iş parçacıklı | Ağırlıklı tek iş parçacıklı (yeni sürümlerde iyileşti) |
| Ek yetenekler | Yok (sade tasarım) | Pub/sub, transaction, TTL, Lua, replikasyon |
| Tipik kullanım | Saf önbellek, oturum | Önbellek + kuyruk + sayaç + gerçek zamanlı |
Özetle Memcached, "sadece hızlı ve basit bir önbellek istiyorum" diyorsanız mükemmel bir tercihtir; kurulumu ve zihinsel modeli daha da yalındır. Redis ise önbelleğin ötesine geçip kuyruk, lider tablosu, sayaç, oturum ve gerçek zamanlı özellikler de istiyorsanız tek başına çok daha fazlasını sunar. Bugün yeni bir proje kuruyorsanız ve tek bir aracı öğrenip her yerde kullanmak istiyorsanız çoğu ekip Redis'e yönelir; ama var olan, sade bir önbellek ihtiyacınız varsa Memcached'i değiştirmek için de acele etmeyin.
Bellek Boyutlandırma, İzleme ve Yaygın Hatalar#
Memcached'e ayıracağınız bellek miktarını (-m) doğru seçmek performansın anahtarıdır. Çok az verirseniz LRU sürekli devreye girer, kayıtlar daha kullanılmadan atılır ve hit oranı düşer; çok fazla verirseniz sunucunun asıl işleri için (web sunucusu, PHP-FPM, MySQL) RAM kalmaz ve sistem takas alanına (swap) düşerek yavaşlar. İyi bir başlangıç, boş RAM'in bir kısmını Memcached'e ayırıp stats çıktısını izlemektir. evictions sayacı sürekli artıyorsa belleği artırma zamanı gelmiştir; get_hits ile get_misses oranı da önbelleğin işe yarayıp yaramadığını gösterir.
Servisi izlemek için birkaç pratik komut vardır:
# Anlık istatistikler (hit/miss, bellek, bağlantı, eviction)
echo -e "stats\r" | nc 127.0.0.1 11211
# Slab (bellek dilimi) dağılımını görün
echo -e "stats slabs\r" | nc 127.0.0.1 11211
# Debian ile gelen izleme aracı — anlık throughput
memcached-tool 127.0.0.1:11211 stats
memcached-tool 127.0.0.1:11211 display
En sık yapılan hatalar da temel yanlış anlamalardan doğar. Birincisi, Memcached'i kalıcı veritabanı sanmak; servis yeniden başladığında önbellek boşalır, bu yüzden kaybı tolere edilemeyen veriyi orada asıl kaynak olarak tutmayın. İkincisi, tek bir değere 1 MB'ı aşan devasa nesneler koymaya çalışmak. Üçüncüsü, veri değiştiğinde ilgili anahtarı silmeyi unutup bayat veri döndürmek. Dördüncüsü ve en tehlikelisi, servisi 0.0.0.0'da açık bırakmak; güvenlik bölümünde anlattığımız gibi bu, veriyi ve sunucuyu doğrudan riske atar. Bu tuzaklardan kaçınırsanız Memcached size yıllarca sorunsuz hizmet eder. Asıl darboğaz veritabanının kendisindeyse, önce MySQL veritabanı yönetimi tarafındaki indeks ve sorgu iyileştirmelerine bakmak da iyi bir fikirdir.
Sıkça Sorulan Sorular#
Memcached veriyi kalıcı olarak saklar mı?#
Hayır, Memcached veriyi yalnızca bellekte (RAM) tutar ve diske hiç yazmaz. Servis yeniden başladığında ya da sunucu kapandığında içindeki tüm kayıtlar silinir. Bu bilinçli bir tasarım tercihidir; Memcached bir önbellektir, tek doğruluk kaynağı değildir. Kaybını tolere edemeyeceğiniz verileri her zaman MySQL gibi kalıcı bir veritabanında tutun, Memcached'i yalnızca onun önünde bir hızlandırıcı olarak kullanın. Kalıcılık gerçekten gerekiyorsa diske yazabilen Redis daha uygundur.
Memcached kimlik doğrulaması olmadan güvenli mi?#
Memcached varsayılan olarak kimlik doğrulaması yapmaz, bu yüzden porta erişebilen herkes tüm veriyi okuyup silebilir. Güvenliğin tamamı erişimi kısıtlamaya dayanır. Servisi mutlaka -l 127.0.0.1 ile yalnızca yerel makineye kilitleyin, UDP'yi -U 0 ile kapatın ve farklı sunucular arasında kullanıyorsanız güvenlik duvarında portu yalnızca uygulama sunucusunun IP'sine açın. İnternete açık, parolasız bir Memcached hem veri sızıntısına hem de DDoS yansıma saldırılarına davetiye çıkarır; bu ayarı asla atlamayın.
Memcached'e ne kadar bellek ayırmalıyım?#
Buna sabit bir rakam yerine sunucunuzun toplam RAM'ine ve diğer servislerin ihtiyacına göre karar vermelisiniz. Web sunucusu, PHP-FPM ve MySQL için gereken belleği ayırdıktan sonra kalan boş RAM'in bir bölümünü Memcached'e verin; küçük bir siteye 64-256 MB genellikle yeter. Ardından stats çıktısındaki evictions sayacını izleyin: sürekli artıyorsa bellek yetersizdir ve artırmalısınız. Sistemin takas alanına düşmesine yol açacak kadar çok da vermeyin, aksi halde önbellek sunucuyu hızlandıracağına yavaşlatır.
PHP'de memcache mi memcached mi kullanmalıyım?#
Yeni projelerde memcached uzantısını (sonunda "d" olanı, yani php-memcached) tercih edin. Bu uzantı libmemcached kütüphanesine dayanır, daha aktif geliştirilir ve çoklu sunucu, binary protokol, veri serileştirme gibi modern özellikleri destekler. Sonu "d" olmayan eski memcache uzantısı hâlâ çalışsa da geride kalmıştır ve yeni kurulumlarda önerilmez. WordPress ve Laravel gibi popüler platformların nesne önbelleği eklentileri de genellikle memcached uzantısını bekler.
Memcached mi Redis mi seçmeliyim?#
Yalnızca hızlı ve sade bir önbellek istiyorsanız Memcached mükemmel iş görür; kurulumu ve mantığı çok basittir. Ancak önbelleğin yanında kuyruk, sayaç, lider tablosu, oturum deposu, yayınla-abone ol veya diske kalıcı yazma gibi ek yetenekler de istiyorsanız Redis tek başına çok daha fazlasını sunar. Bugün yeni bir sistem kuran çoğu ekip, tek bir araçla her ihtiyacı karşılayabildiği için Redis'i tercih ediyor. Zaten çalışan ve ihtiyacınızı gören bir Memcached kurulumunuz varsa da onu değiştirmek için acele etmenize gerek yoktur.
WordPress'te Memcached kurunca hız gerçekten artar mı?#
Evet, özellikle veritabanı sorgusu yoğun ve trafiği yüksek sitelerde belirgin bir fark yaratır. Kalıcı bir nesne önbelleği eklentisiyle Memcached'i devreye aldığınızda WordPress, ayarları ve tekrarlayan sorguları her istekte veritabanından çekmek yerine bellekten okur; böylece MySQL yükü düşer ve sayfa üretim süresi kısalır. En iyi sonucu almak için nesne önbelleğini bir de tam sayfa önbelleğiyle birlikte kullanın. Küçük ve az ziyaret alan bir blogda fark daha sınırlı kalabilir, ama ölçek büyüdükçe kazanç katlanarak artar.
Kapanış#
Memcached, karmaşık olmadan büyük fayda sağlayan ender araçlardan biridir: birkaç dakikalık kurulum, avuç içi kadar yapılandırma ve karşılığında veritabanı yükünde çarpıcı bir düşüş. Anahtar-değer bellek modelini, cache-aside desenini ve en önemlisi servisi 127.0.0.1'e kilitleyen güvenlik adımını doğru uyguladığınızda, sitenizin en pahalı işi olan tekrarlı sorgular sessizce ortadan kalkar. Redis ile arasındaki farkı da artık biliyorsunuz: sade bir önbellek için Memcached, çok yönlü bir veri altyapısı için Redis.
Bu hız kazancının tam karşılığını almak için altyapının da hazır olması gerekir. Kaynakları size ait, önbelleği rahatça çalıştırabileceğiniz bir sunucu için VDS sunucu çözümlerimize ve genel hosting planlarımıza göz atabilir; kurulum ve sıkılaştırmayı uzmanlarımıza bırakmak isterseniz sunucu yönetimi hizmetimizle Memcached'i sizin yerinize güvenli biçimde yapılandırabiliriz. Doğru araç, doğru sunucu ve doğru yapılandırmayla siteniz hem daha hızlı hem de daha dayanıklı olur.