• 14-06-2026, 00:42:28
    #1
    Merhaba arkadaşlar,
    Aktif olarak CodeIgniter 4 ile geliştirdiğimiz bir web projemiz var. Projenin tepki sürelerini (TTFB) düşürmek ve veritabanı yükünü hafifletmek amacıyla Redis entegrasyonu yapmaya karar verdik. Redis'i hem Session (Oturum) yönetimi hem de Cache (Önbellek) mekanizması için kullanacağız.
    Şu anki sunucu altyapımız ve teknolojilerimiz şu şekilde:
    • Framework: CodeIgniter 4.x
    • PHP Sürümü: PHP 8.x
    • İşletim Sistemi: Ubuntu
    • Mevcut Sunucu Özellikleri: 8 Çekirdek CPU, 40 GB RAM
    Bu aşamada sistem mimarisi ve stabilite açısından birkaç sorum olacak:
    1. Redis'i mevcut web/veritabanı sunucumuzun içine kurup optimize etmek mi daha mantıklıdır, yoksa sadece Redis için ayrı bir VPS/VDS (Örn: 4 CPU, 8 GB RAM) kiralamak mı gerekir?
    2. Canlı ortamda (Production) Redis'in çökmesini veya veri kaybını önlemek için Linux tarafında (vm.overcommit_memory, THP vb.) kesinlikle yapılması gereken kritik ayarlar nelerdir?
    3. CI4 tarafında Redis Handler kullanırken dikkat etmemiz gereken bir "pitfall" (tuzak) veya performans kaybı yaşatacak bir durum var mıdır?
    Deneyimli arkadaşların tecrübelerinden ve tavsiyelerinden yararlanmak isterim. Şimdiden teşekkürler!
  • 14-06-2026, 00:55:27
    #2
    Next-Gen Solutions
    Selam,
    Ben bu senaryoda Redis’i ayrı bir VPS’e taşımak yerine aynı sunucuda tutardım. Özellikle tek web sunucusu varsa ve ana hedef TTFB düşürmekse, Redis’i lokal çalıştırıp mümkünse TCP yerine unix socket üzerinden bağlamak daha mantıklı olur.
    Çünkü cache ve session tarafı neredeyse her request’te devreye giriyor. Redis’i ayrı bir makineye aldığında, aynı datacenter içinde bile olsa araya ekstra network gecikmesi giriyor. Bu gecikme küçük görünür ama yüksek istek sayısında TTFB tarafında hissedilebilir. Tek sunuculu yapıda ayrı Redis VPS’i çoğu zaman performanstan çok komplekslik ekliyor.
    40 GB RAM bu iş için fazlasıyla yeterli. Redis zaten komut işleme tarafında ağırlıklı olarak tek thread çalıştığı için ayrı 4 çekirdekli bir sunucunun CPU avantajı da pratikte çok anlamlı olmaz. Ayrı Redis sunucusu daha çok load balancer arkasında birden fazla web sunucusu kullanmaya başladığında anlam kazanır; o noktada ortak session/cache store ihtiyacı doğar.
    Linux tarafında ise birkaç ayar önemli. vm.overcommit_memory = 1 mutlaka yapılmalı, THP kapalı olmalı ve somaxconn değeri Redis tarafındaki backlog ayarıyla uyumlu tutulmalı. Bir de maxmemory ayarlanırken RAM’in tamamı Redis’e verilmemeli; özellikle persistence kullanılıyorsa fork sırasında oluşacak bellek ihtimali için pay bırakmak gerekir.
    CI4 tarafında en çok gözden kaçan konu session lock oluyor. Aynı session’a ait eşzamanlı isteklerde RedisHandler kilit koyduğu için, özellikle AJAX yoğun yapılarda istekler birbirini bekleyebiliyor. Bu durumda sorun Redis yavaşlığı gibi görünse de aslında istekler session lock yüzünden sıraya girmiş oluyor. Session gerekmeyen endpoint’lerde session’ı hiç açmamak veya işi bitince erken kapatmak ciddi fark ettirebilir.
    Session ve cache’i aynı Redis instance’ında tutma konusunda da dikkatli olmak lazım. Eğer aynı instance’ta allkeys-lru gibi bir eviction policy kullanılırsa, bellek dolduğunda session key’leri de silinebilir ve kullanıcılar sebepsiz logout olabilir. Daha sağlıklı yapı, session ve cache’i ayrı instance/port olarak ayırmak olur. Session tarafında persistence açık ve daha korumacı bir policy; cache tarafında ise yeniden üretilebilir veri olduğu için LRU ve persistence kapalı yapı tercih edilebilir.
    Ek olarak phpredis kullanmanı öneririm; Predis’e göre performans tarafında daha iyi sonuç verir. Redis timeout değerlerini de düşük tutmak önemli, çünkü Redis tarafındaki kısa bir takılmanın tüm uygulamayı bekletmesini istemezsin. Popüler cache key’lerinde de stampede ihtimaline karşı TTL’leri biraz dağıtmak veya regenerate sırasında lock kullanmak faydalı olur.
  • 14-06-2026, 01:20:16
    #3
    xmandalorian adlı üyeden alıntı: mesajı görüntüle
    Selam,
    Ben bu senaryoda Redis’i ayrı bir VPS’e taşımak yerine aynı sunucuda tutardım. Özellikle tek web sunucusu varsa ve ana hedef TTFB düşürmekse, Redis’i lokal çalıştırıp mümkünse TCP yerine unix socket üzerinden bağlamak daha mantıklı olur.
    Çünkü cache ve session tarafı neredeyse her request’te devreye giriyor. Redis’i ayrı bir makineye aldığında, aynı datacenter içinde bile olsa araya ekstra network gecikmesi giriyor. Bu gecikme küçük görünür ama yüksek istek sayısında TTFB tarafında hissedilebilir. Tek sunuculu yapıda ayrı Redis VPS’i çoğu zaman performanstan çok komplekslik ekliyor.
    40 GB RAM bu iş için fazlasıyla yeterli. Redis zaten komut işleme tarafında ağırlıklı olarak tek thread çalıştığı için ayrı 4 çekirdekli bir sunucunun CPU avantajı da pratikte çok anlamlı olmaz. Ayrı Redis sunucusu daha çok load balancer arkasında birden fazla web sunucusu kullanmaya başladığında anlam kazanır; o noktada ortak session/cache store ihtiyacı doğar.
    Linux tarafında ise birkaç ayar önemli. vm.overcommit_memory = 1 mutlaka yapılmalı, THP kapalı olmalı ve somaxconn değeri Redis tarafındaki backlog ayarıyla uyumlu tutulmalı. Bir de maxmemory ayarlanırken RAM’in tamamı Redis’e verilmemeli; özellikle persistence kullanılıyorsa fork sırasında oluşacak bellek ihtimali için pay bırakmak gerekir.
    CI4 tarafında en çok gözden kaçan konu session lock oluyor. Aynı session’a ait eşzamanlı isteklerde RedisHandler kilit koyduğu için, özellikle AJAX yoğun yapılarda istekler birbirini bekleyebiliyor. Bu durumda sorun Redis yavaşlığı gibi görünse de aslında istekler session lock yüzünden sıraya girmiş oluyor. Session gerekmeyen endpoint’lerde session’ı hiç açmamak veya işi bitince erken kapatmak ciddi fark ettirebilir.
    Session ve cache’i aynı Redis instance’ında tutma konusunda da dikkatli olmak lazım. Eğer aynı instance’ta allkeys-lru gibi bir eviction policy kullanılırsa, bellek dolduğunda session key’leri de silinebilir ve kullanıcılar sebepsiz logout olabilir. Daha sağlıklı yapı, session ve cache’i ayrı instance/port olarak ayırmak olur. Session tarafında persistence açık ve daha korumacı bir policy; cache tarafında ise yeniden üretilebilir veri olduğu için LRU ve persistence kapalı yapı tercih edilebilir.
    Ek olarak phpredis kullanmanı öneririm; Predis’e göre performans tarafında daha iyi sonuç verir. Redis timeout değerlerini de düşük tutmak önemli, çünkü Redis tarafındaki kısa bir takılmanın tüm uygulamayı bekletmesini istemezsin. Popüler cache key’lerinde de stampede ihtimaline karşı TTL’leri biraz dağıtmak veya regenerate sırasında lock kullanmak faydalı olur.
    Değerli yorumunuz için çok teşekkür ederim hocam