• 28-01-2018, 02:34:45
    #1
    Merhabalar,
    Codeigniter (Memcache) Cache sistemini kullanacağım.
    Verilerin geçici (belirtilen süre boyunca) ram üzerinde depolanmasını sağlayan bir sistem sanırım.
    Örneğin benim bir tablom var ve bu tabloma 3 dakikada bir 1 dakikada bir veya 5 dakikada bir veri ekleniyor.
    Bu eklenen verileri ben memcache ile alıp listelemem mantıksız mı olmakta?

    Memcache daha çok insert ve update işlemlerinin daha az yapıldığı alanlarda mı kullanılmakta?
    Yada benim tabloma 1 dakikada bir veri eklendikçe her 1 dakikada bir memcache ile eklenen veriyimi önbelleklemem gerekiyor.

    Devamlı büyük bir veritabanı tablomdan sorgu yapmamak adına nasıl bir mantık izleyebilirim?
  • 28-01-2018, 03:29:56
    #2
    Daha uygulamanın başındasınız, redis memcached'a göre şuan daha iyi, bir çok karşılaştırma tablolarında ve test sonuçlarında redis öneriliyor.

    https://www.codeigniter.com/userguid...#redis-caching

    burada örnek kullanımı var.

    ve cache'lemeye gelince, çok sık aralıklarla güncellenmeyen şeyleri yapabilirsiniz. Mesela fatura uygulaması yapıyorsunuz diyelim, fatura içeriklerini cache'lemenize gerek yok, kullanıcılar sürekli olarak tek tek fatura içeriğini açmaz, açsa bile başka bir kullanıcı o an o faturayı yeni güncellemişse ram'den yüklemek mantıksız olur, ancak fatura listesini cache'leye bilirsiniz mesela, detaylandırılabilir, işin daha çok select ile yapılan sorgularda cache'leme yapılıyor. Biraz da test yapmak gerekiyor, mesela fatura örneğimize dönelim, tüm faturaları select listelediğinizde gelecek veri boyutu fazladır, ancak fatura sayısını saydırmak daha ufak bir sonuç döndürür, cache'leme yaparken cache yoksa listeleme sorgunuzu döndürür ve fatura sayısını bir değişkene vs (örnek olarak veriyorum, production sürümünde bir uygulama için farklı yöntemler tercih edilebilir) kaydeder, ve her fatura modulu açılışında bu sayıyı kontrol ettirebilirsiniz. Bu şekilde olduğunda fatura modülü açıldığında fatura sayısına bakılır boşsa fatura listesi çekilir ve cache'lenir, sonraki girişinde fatura sayısına tekrar baktığında null değeri almazsa bu defa veritabanına fatura sayısını sorar, sonuç aynı ise cache'den çekersiniz, değilse tekrardan veritabanından çekilir, fatura sayı değişkeni güncellenir ve faturaları uygulamada listelersiniz.

    Çok basitce fazla planlamadan gelişi güzel yazdım. Dediğim gibi uygulama yazarken ihtiyaçlara ve yapılan işlem senaryolarına göre farklılık gösterebilir.

    https://www.infoworld.com/article/30...r-caching.html

    bu adreste memcached nerelerde, redis nerelerde kullanılır, hangisi hangi işlerde becerikli kısaca değinilmiş. Uygulamanızın ve ihtiyaçlarınızın büyüklüğüne göre biraz araştırma yapıp en idealini seçebilirsiniz.
  • 28-01-2018, 03:43:37
    #3
    iMiral adlı üyeden alıntı: mesajı görüntüle
    Daha uygulamanın başındasınız, redis memcached'a göre şuan daha iyi, bir çok karşılaştırma tablolarında ve test sonuçlarında redis öneriliyor.

    https://www.codeigniter.com/userguid...#redis-caching

    burada örnek kullanımı var.

    ve cache'lemeye gelince, çok sık aralıklarla güncellenmeyen şeyleri yapabilirsiniz. Mesela fatura uygulaması yapıyorsunuz diyelim, fatura içeriklerini cache'lemenize gerek yok, kullanıcılar sürekli olarak tek tek fatura içeriğini açmaz, açsa bile başka bir kullanıcı o an o faturayı yeni güncellemişse ram'den yüklemek mantıksız olur, ancak fatura listesini cache'leye bilirsiniz mesela, detaylandırılabilir, işin daha çok select ile yapılan sorgularda cache'leme yapılıyor. Biraz da test yapmak gerekiyor, mesela fatura örneğimize dönelim, tüm faturaları select listelediğinizde gelecek veri boyutu fazladır, ancak fatura sayısını saydırmak daha ufak bir sonuç döndürür, cache'leme yaparken cache yoksa listeleme sorgunuzu döndürür ve fatura sayısını bir değişkene vs (örnek olarak veriyorum, production sürümünde bir uygulama için farklı yöntemler tercih edilebilir) kaydeder, ve her fatura modulu açılışında bu sayıyı kontrol ettirebilirsiniz. Bu şekilde olduğunda fatura modülü açıldığında fatura sayısına bakılır boşsa fatura listesi çekilir ve cache'lenir, sonraki girişinde fatura sayısına tekrar baktığında null değeri almazsa bu defa veritabanına fatura sayısını sorar, sonuç aynı ise cache'den çekersiniz, değilse tekrardan veritabanından çekilir, fatura sayı değişkeni güncellenir ve faturaları uygulamada listelersiniz.

    Çok basitce fazla planlamadan gelişi güzel yazdım. Dediğim gibi uygulama yazarken ihtiyaçlara ve yapılan işlem senaryolarına göre farklılık gösterebilir.

    https://www.infoworld.com/article/30...r-caching.html

    bu adreste memcached nerelerde, redis nerelerde kullanılır, hangisi hangi işlerde becerikli kısaca değinilmiş. Uygulamanızın ve ihtiyaçlarınızın büyüklüğüne göre biraz araştırma yapıp en idealini seçebilirsiniz.
    Öncelikle değerli açıklamalarınız için çok teşekkür ediyorum. Benim için gayet açıklayıcı oldu. Redis ve memcache incelemesini yapıp ona göre codeigniter üzerinden kullanım gerçekleştireceğim. Evet başındayım henüz düzgün kullanmak istiyorum. Açıkçası veritabanındaki kayıt sayısı sonucu ile cache içerisindeki veri sayısını karşılaştırarak listelemeyi düşünmüştüm lakin bu basit bir mantık mı böyle mi yapıyorlar gibi bir tereddütte kalmıştım fakat bu şekilde kullanacağım.
    Bu konu haricinde Veritabanı hakkında bir soru daha sormak istiyorum izniniz ile.
    islemler adı altında bir tablomuz olduğunu düşünelim ve bu tablomuzun içeriğinde milyonlarca kayıt olduğunu varsayalım (MYSQL-INNODB Depolama Motoru) ile ne kadar performans elde edilir bilemiyorum tamamen ilişkisel bir veritabanı ve en ufak ilişki düzgün bir şekilde yapılıyor. Milyonlarca kayıt barındıran bir tabloyu en performanslı bir şekilde nasıl kullanabiliriz? Devamlı kayıt aldığını ve devamlı güncellemelere uğradığını düşünün. Bu şekilde CACHE sistemini kullanmak mantıksız olur dediğiniz gibi. Harici alternatif ne yapılabilir?
  • 28-01-2018, 03:59:14
    #4
    Daha uygulamanızın başındasınız derken, daha başlamamışsınız ihtiyacınıza uygunsa redis öneriyorlar kodlarınızı değiştirmek zorunda kalmayacaksınız noktasını vurgulamak istemiştim, sonradan ihtiyacım aslında buymuş diyip kodları değiştirmek de vardı.

    Sorunuza gelecek olursak, eğer milyonlarca kayıttan söz ediyorsak onu genelde bir çok uygulama şu şekilde çözüyor, ihtiyaç kadarı cache'leniyor. Mesela tablomuzda 2 milyon kayıt var ancak kaç tanesine dönüp bakacağız, işlemler tablosu dediniz mesela, bu işlemleri kullanıcı işlemleri varsayalım, işte şu kaydı açtı, şu içeriği güncelledi gibi, bunları açıp bakan kişi 2 milyon kayıt varsa bunu en alta kadar bir anda inip bakamaz zaten, çok kayıtlı tabloları 20,30, 50, 100,200'er olarak listele opsiyonu koyuluyor bir çok yerde, biz de istersek uygulamamıza bir servis bağlarız, islemler tablosunun son 100 kaydını cachele yaparız, ya da kullanıcı isteği olduğunda yaparız bunu. Örnek olarak, 20'şer olarak listeliyoruz diyelim kaydı, kullanıcı işlemler sayfasına girdiğinde ilk 60 kaydı listeler ve cache'leriz, 20li olarak listelediğimizden ilk 3 sayfamız cache'lenmiş olur, kullanıcı 2. sayfaya tıkladığında cache'den gelecek kayıtlar, 3. sayfada da sonraki 60 kaydı çağırırız mesela, 3. sayfaya ilk cache'lediğimiz 60 kaydın son 20 kayıt cache'den gelir yine hızlı bir şekilde, o kayıtlar incelenirken sonraki 60 kayıt hazır olmuş olur.

    Genelde cache kısmı uygulama yazıldıktan sonraya bırakıyorum ben, çünkü daha belli oluyor, uygulamayı kullanırken hızı neler arttırıyor onu görüyorum, verdiğim örnekdeki gibi mesela uygulama kullanılırlığını neler arttıracak onlara odaklanıp, hangi bölüm sunucumun belleğini, işlemcisini, veritabanını ne kadar yoruyor, nerelerde cache'leme yaparsam daha hızlı çalışır, hangi tabloları direk veritabanından index'leme yaparsam verimli olur vs gibi.



    Bu arada, verdiğim örnekdeki saydırma işlemi yerine veritabanlarındaki Triggers (Tedikleyiciler) özelliğini ya da son id numarasına baz alabilirsin, böylelikle tüm satırları saydırmana gerek kalmaz.
  • 28-01-2018, 04:04:29
    #5
    iMiral adlı üyeden alıntı: mesajı görüntüle
    Daha uygulamanızın başındasınız derken, daha başlamamışsınız ihtiyacınıza uygunsa redis öneriyorlar kodlarınızı değiştirmek zorunda kalmayacaksınız noktasını vurgulamak istemiştim, sonradan ihtiyacım aslında buymuş diyip kodları değiştirmek de vardı.

    Sorunuza gelecek olursak, eğer milyonlarca kayıttan söz ediyorsak onu genelde bir çok uygulama şu şekilde çözüyor, ihtiyaç kadarı cache'leniyor. Mesela tablomuzda 2 milyon kayıt var ancak kaç tanesine dönüp bakacağız, işlemler tablosu dediniz mesela, bu işlemleri kullanıcı işlemleri varsayalım, işte şu kaydı açtı, şu içeriği güncelledi gibi, bunları açıp bakan kişi 2 milyon kayıt varsa bunu en alta kadar bir anda inip bakamaz zaten, çok kayıtlı tabloları 20,30, 50, 100,200'er olarak listele opsiyonu koyuluyor bir çok yerde, biz de istersek uygulamamıza bir servis bağlarız, islemler tablosunun son 100 kaydını cachele yaparız, ya da kullanıcı isteği olduğunda yaparız bunu. Örnek olarak, 20'şer olarak listeliyoruz diyelim kaydı, kullanıcı işlemler sayfasına girdiğinde ilk 60 kaydı listeler ve cache'leriz, 20li olarak listelediğimizden ilk 3 sayfamız cache'lenmiş olur, kullanıcı 2. sayfaya tıkladığında cache'den gelecek kayıtlar, 3. sayfada da sonraki 60 kaydı çağırırız mesela, 3. sayfaya ilk cache'lediğimiz 60 kaydın son 20 kayıt cache'den gelir yine hızlı bir şekilde, o kayıtlar incelenirken sonraki 60 kayıt hazır olmuş olur.

    Genelde cache kısmı uygulama yazıldıktan sonraya bırakıyorum ben, çünkü daha belli oluyor, uygulamayı kullanırken hızı neler arttırıyor onu görüyorum, verdiğim örnekdeki gibi mesela uygulama kullanılırlığını neler arttıracak onlara odaklanıp, hangi bölüm sunucumun belleğini, işlemcisini, veritabanını ne kadar yoruyor, nerelerde cache'leme yaparsam daha hızlı çalışır, hangi tabloları direk veritabanından index'leme yaparsam verimli olur vs gibi.
    Peki son olarak hocam redis ile kullanılan cache sistemi dışında codeigniter dökümanında https://www.codeigniter.com/userguid...e/caching.html bir database cache olayı var. Kullanımı ise

     
    // Turn caching on 
    $this->db->cache_on(); 
     
    $query = $this->db->query("SELECT * FROM mytable"); 
     
     // Turn caching off for this one query 
    $this->db->cache_off(); 
     
    $query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'"); 
     
     // Turn caching back on 
    $this->db->cache_on();
     
     $query = $this->db->query("SELECT * FROM another_table");
    Şeklinde. SQL Sorgusu önce Cache'i aktif edip daha sonra yeni bir sorguda kapatıyor. Ben tam olarak bu mantığı anlayamadım ney işe yaradığına dair çünkü kısa bir kullanımı var.
    Bilginiz var mı acaba?
  • 28-01-2018, 04:12:25
    #6
    Bu örnekte bir sorgu için cache nasıl açılır, sonra nasıl kapatıp cache'leme olamayan bir sorgu döndürülüp ardına hemen cacheli başka bir tablo sorgusu nasıl yapılır onu göstermişler, yani işte bu kadar basit, cache_on, cache_off ile kolaylıkla aç kapa yapabilirsiniz diye göstermek için bu örnek verilmiş sanırım.

    https://www.youtube.com/watch?v=S_jA...ug_b5tWqah_tfJ

    bu seride laravel ve redis kullanımı detaylı olarak anlatılıyor, laravel kullanmamışsan ya da kullanmayı düşünmüyorsan bile, verdiği örneklerde hangi işlemlerde kullandığına bakarak mantığını kavrayabilirsin.
  • 28-01-2018, 04:19:46
    #7
    iMiral adlı üyeden alıntı: mesajı görüntüle
    Bu örnekte bir sorgu için cache nasıl açılır, sonra nasıl kapatıp cache'leme olamayan bir sorgu döndürülüp ardına hemen cacheli başka bir tablo sorgusu nasıl yapılır onu göstermişler, yani işte bu kadar basit, cache_on, cache_off ile kolaylıkla aç kapa yapabilirsiniz diye göstermek için bu örnek verilmiş sanırım.

    https://www.youtube.com/watch?v=S_jA...ug_b5tWqah_tfJ

    bu seride laravel ve redis kullanımı detaylı olarak anlatılıyor, laravel kullanmamışsan ya da kullanmayı düşünmüyorsan bile, verdiği örneklerde hangi işlemlerde kullandığına bakarak mantığını kavrayabilirsin.
    Hocam çok teşekkürler tüm açıklamalar ve önerileriniz için dediklerinizi inceleyip gerekli çalışmama başlayacağım. Bu açıklamalar benim için ve ihtiyacı olan arkadaşlarımız için çok iyi oldu