Caching, her türlü uygulamanın performansını artırmaya yönelik bir mekanizmadır. Teknik olarak caching; “bir önbellekten veri depolama ve bunlara erişme” işlemidir. Diğer taraftan ise cache (bellek); aynı veriler için gelecekteki isteklerin daha hızlı sunulabilmesi için verileri depolamayı amaçlayan bir yazılım veya donanım bileşenidir.
Önbelleğe almanın ortaya çıkmasının ana nedeni, kalıcı belleklerden verilere erişmenin ciddi anlamda zaman almasıdır. Bu nedenle, veriler alındığında veya işlendiğinde daha verimli bir bellekte saklanmalıdır. Birincil amacı daha yavaş veri depolama katmanlarına erişme ihtiyacını azaltmak olan yüksek hızlı veri depolama katmanı olarak düşünülebilen belleği, cache olarak adlandırabiliriz. Uygun maliyetli ve verimli olması için önbellekler, özellikle geleneksel belleklerle karşılaştırıldığında nispeten daha küçük olmalıdır. Bu nedenle genellikle RAM (Rastgele Erişim Belleği) ve bir yazılım bileşeni gibi hızlı erişim donanımı kullanılarak uygulanır.
Cache sayesinde önceden alınan veya hesaplanan verileri, verimli bir şekilde yeniden kullanmak için bir mekanizma kurmak mümkündür. Yeni bir istek geldiğinde, istenen veriler önce önbellekte aranır. İstenen veriler önbellekte bulunduğunda isabetli bir şekilde eşleştirilir. Aksi durum gerçekleştiğinde eşleştirme yapılamaz. Aslında önbellekten gerekli verileri okumanın, orijinal veri deposundan okumaktan veya sonucu yeniden hesaplamaktan daha hızlı olduğu varsayılır. Bu nedenle, önbellekten ne kadar çok istek sunulabilirse sistem o kadar hızlı olacaktır.
Caching son derece önemlidir. Çünkü geliştiricilerin önemli ölçüde performans iyileştirmeleri elde etmesine olanak tanır. Performans iyileştirmeleri kullanıcılar için hayati önem taşımaktadır. Ne kullanıcılar ne de geliştiriciler, uygulamaları kullanırken işlemlerin uzun sürmesini özellikle istemez. Geliştiriciler, uygulamaların en performanslı sürümünün kullanılmasını ister. Diğer taraftan kullanıcılar da işlemlerin sadece birkaç saniye ve hatta mili saniyeler sürmesini ister. Şu bir gerçektir ki, hiç kimse mesajının yüklenip yüklenmediğine bakarak zamanını boşa harcamayı sevmez.
Ayrıca, yüksek performans sunmak o kadar önemlidir ki, caching kavramı bilgisayar teknolojisinde hızla bir şekilde kabul görmüştür. Bu durum giderek daha fazla hizmetin onu kullandığı ve pratik olarak her yerde hazır olduğu anlamına gelir. Sonuç olarak, piyasadaki çok sayıda uygulama ile rekabet etmek istiyorsanız, önbellek sistemlerini düzgün bir şekilde uygulamanız gerekiyor. Ayrıca, kullanıcılara diğer sistemlere nispeten sistemlerinizin neden daha yavaş olduğunu açıklamak sizin açınızdan sorun teşkil edebilir. Böylece kullanıcıların kafasında soru işareti bırakabilirsiniz.
Önbelleğe almanın bir diğer önemli yönü, her seferinde yeni isteklerde bulunmaktan veya verileri yeniden işlemekten kaçınmamıza izin vermesidir. Böylece, ağ yükü gibi ek yüklerden kaçınabilir ve özellikle istekler karmaşık ayrıntılar içeriyorsa CPU kullanımını azaltabilirsiniz. Bu, makinelerinizin veya sunucularınızın ömrünü uzatır. Ayrıca, yeni istekler yapmaktan kaçınmak, ihtiyaç duyulan toplam istek miktarını azaltır ve bu da altyapınızın maliyetini azaltır. Örneğin; Bulut platformları veya genel API sağlayıcıları ile çalışırken, hizmetler arasındaki herhangi bir ağ iletişiminin faturalandırılması herkesçe malumdur. Gereksiz yere yapılan her istek maliyet olarak karşınıza çıkar.
Caching hiçbir şekilde basit bir uygulama değildir ve konunun doğasında kaçınılmaz zorluklar vardır. Karşılaşılabilecek zorluklardan bazıları aşağıda kapsamlı bir şekilde açıklanmıştır:
Veriler önbelleğe alındığında bir kopya oluşturulduğundan, artık aynı verinin iki kopyası vardır. Bu zamanla farklılaşabilecekleri anlamına gelir. Kısaca caching ile ilgili en önemli ve karmaşık problem tutarlılık sorunudur. Biri diğerine tercih edilen belirli bir çözüm yolu yoktur. En iyi yaklaşım gereksinimlere göre hareket etmektir. En iyi cache güncellemesini belirlemek veya mekanizmayı geçersiz kılmak, cache ile ilgili en büyük sorunlardan biridir. Ve belki de bilgisayar biliminde karşılaşılan çözülmesi en zor problemlerden biridir.
Hemen hemen her türlü veri önbelleğe alınabilir. Bu, önbelleğimizde nelerin bulunacağını ve nelerin hariç tutulacağını seçmenin sonsuz olasılıklara sahip olduğu anlamına gelir. Bu nedenle çok karmaşık bir durum haline gelebilir. Bu sorunla mücadele ederken, dikkate alınması gereken bazı hususlar vardır. İlk olarak, verilerin sık sık değişmesini bekliyorsanız, onu çok uzun süre önbelleğe almak istememelisiniz. Aksi takdirde, kullanıcılara yanlış veriler sunabilirsiniz. Öte yandan, bu aynı zamanda eski verilere ne kadar süre tahammül edebileceğinize de bağlıdır.
İkinci olarak önbelleğiniz, oluşturulması veya alınması çok zaman alan, sık sık gerekli verileri depolamaya her zaman hazır olmalıdır. Bu verileri belirlemek kolay bir iş değildir ve önbelleğinizi gereksiz verilerle doldurma riskiniz olabilir.
Üçüncüsü, büyük verileri önbelleğe alarak, tüm kullanılabilir belleği tahmininizden daha çabuk ve istenmeyecek şekilde doldurabilirsiniz. Sahip olduğunuz RAM, uygulamanız ve caching sisteminiz arasında paylaşılıyorsa, bu bir sorun haline gelebilir. Bu nedenle caching için ayrılan RAM miktarını sınırlamanız gerekir.
Cache kayıpları, bir önbelleğe sahip olmanın zamana dayalı maliyetini temsil eder. Aslında cache kayıpları, önbellek kullanmayan bir sistemde meydana gelemeyecek gecikmeleri ortaya çıkarır. Bu nedenle, bir önbelleğe sahip olmanın getirdiği hız artışından yararlanmak için, önbellek kayıpları nispeten düşük tutulmalıdır. Özellikle, cache isabet yüzdelerine kıyasla düşük olmalıdır. Bu sonuca ulaşmak kolay değildir ve eğer ulaşılamazsa önbellek sisteminiz için ek yükten başka bir şey değildir.
Cache genel bir kavram olmasına rağmen, diğerlerinden ayrışan birkaç tarafı vardır. Bu ayrışan taraflar, her geliştiricinin önbellek kavramına aşağıda açıklandığı gibi ortak bir yaklaşım gösterir ve hiçbiri göz ardı edilemez.
Bu yaklaşımda, önbelleğe alınan veriler, orijinal verilerin bulunduğu tipik depolama sisteminden daha hızlı olduğu varsayılan RAM’ de doğrudan depolanır. Bu tür önbelleğe almanın en yaygın uygulaması, anahtar/değer (key-value) veri tabanlarına dayalıdır. Veri tabanları anahtar/değer çiftlerinden oluşan kümeler olarak görülebilir. Anahtar benzersiz bir değerle temsil edilirken, değer önbelleğe alınmış verilerle temsil edilir.
Esasen bu, her bir veri parçasının benzersiz bir değerle tanımlandığı anlamına gelir. Bu değeri belirterek, anahtar-değer veri tabanı ilişkili değeri döndürür. Böyle bir çözüm hızlı, verimli ve anlaşılması kolaydır. Bu nedenle, bir cache katmanı oluşturmaya çalışan geliştiriciler genellikle bunu kullanmayı tercih eder.
Her veri tabanı, genellikle bir caching düzeyiyle beraber gelir. Spesifik olarak, bir veri tabanını aşırı sorgulamaktan kaçınmak için çoğunlukla dahili bir cache kullanılır. Yürütülen son sorguların sonucu önbelleğe alınır ve önceden önbelleğe alınan veriler sorgulandığında veri tabanı hemen istekleri sağlayabilir. Bu şekilde, istenen önbelleğe alınmış verilerin geçerli olduğu süre boyunca, veri tabanı sorguların yürütülmesini önleyebilir. Her veri tabanı bunu farklı şekilde uygulayabilse de en popüler yaklaşım, anahtar/değer çiftlerini depolayan bir karma tablo kullanmaya dayanır. Bilindiği gibi anahtar, değeri aramak ve eşleşmek için kullanılır. Bu tür önbelleklerin genellikle varsayılan olarak ORM (Nesne İlişkisel Eşleme) teknolojileri tarafından sağlandığını unutmayın.
Web Caching iki alt kategoriye ayrılır:
Bu önbellek türü, çoğu İnternet kullanıcısı için tanıdıktır ve istemcilerde depolanır. Genellikle tarayıcıların bir parçası olduğu için “Web Tarayıcı Caching” olarak da adlandırılır. Çok sezgisel bir şekilde çalışır. Bir tarayıcı bir web sayfasını ilk yüklediğinde, metin, resimler, stil sayfaları, komut dosyaları ve medya dosyaları gibi sayfa kaynaklarını depolar. Aynı sayfaya bir sonraki tıklandığında, tarayıcı daha önce önbelleğe alınmış kaynakları arayabilir ve bunları kullanıcının makinesinden alabilir. Bu genellikle istenilenleri ağdan indirmekten çok daha hızlıdır.
Web sunucu caching, kaynakları yeniden kullanmak üzere sunucu tarafında depolamayı amaçlayan bir mekanizmadır. Spesifik olarak, böyle bir yaklaşım, oluşturulması zaman alan dinamik olarak oluşturulmuş içerikle uğraşırken yararlıdır. Tersine, statik içerik durumunda kullanışlı değildir. Web sunucusu caching sunucuların aşırı yüklenmesini önler, yapılacak işi azaltır ve sayfa sunum hızını artırır.
CDN (Content Delivery Network), “İçerik Dağıtım Ağı” anlamına gelir ve web sayfaları, stil sayfaları, komut dosyaları ve medya dosyaları gibi içeriği proxy sunucularında önbelleğe almayı amaçlar. Kullanıcı ve kaynak sunucu arasında kaynaklarını depolayan bir ağ geçidi sistemi olarak görülebilir. Kullanıcı bir kaynağa ihtiyaç duyduğunda, bir proxy sunucusu onu durdurur ve bir kopyası olup olmadığını kontrol eder. Eğer öyleyse, kaynak hemen kullanıcıya teslim edilir; aksi takdirde istek kaynak sunucuya iletilir. Bu proxy sunucuları dünya çapında çok sayıda konuma yerleştirilir ve kullanıcı istekleri dinamik olarak en yakınına yönlendirilir. Bu nedenle, son kullanıcılara kaynak sunuculardan daha yakın olmaları beklenir, bu da ağ gecikmesinde bir azalma anlamına gelir. Ayrıca, kaynak sunuculara yapılan istek sayısını da azaltır.