How to choose between cache-aside, read-through, write-through, client-side, and distributed caching strategies Son zamanlarda bahsettiğimiz gibi Pekka Enberg'in yazmaya karar verdiğinden memnunuz Üç bölümünü desteklemekten gurur duyuyoruz. Neden Data Cache? Latince Hakkında Bir Kitap Latency kitabını PDF olarak alın Latency kitabını PDF olarak alın Latency kitabını PDF olarak alın Ayrıca, Pekka sadece o kitaptan anahtar alıntıları paylaştı (Şu anda talep üzerine kullanılabilir) Low Latency Apps Hakkında Bilgi Devam edeceğiz bizim Kitap Pekka'nın cache bölümünden daha fazlasıyla ayrıntılar içerir. Yayıncının izniyle burada yeniden basılmıştır. latentlik *Şimdi Uygulama cache eklediğinizde, öncelikle bir veritabanı veya hizmet gibi temel yedekleme depolarından nasıl okunur ve yazıldığına karar veren caching stratejisini göz önünde bulundurmalısınız. Başka bir deyişle, uygulamanız cache'den bir değeri aradığında, ancak değeri yoksa veya sona ermişse, caching stratejisi, uygulamanızın ya da arama depolamasından değeri alırken cache'nin aktif olup olmadığını belirlemelidir. Cache-aside Çekiliş Cache-side caching muhtemelen karşılaşacağınız en tipik caching stratejisidir. bir cache vurduğunda, veri erişimi gecikmesi, genellikle küçük olan iletişim gecikmesi tarafından yönetilir, çünkü bir cache sunucusuna veya hatta uygulama bellek alanına yakın bir cache alabilirsiniz. Ancak, bir cache eksikliği olduğunda, cache-side caching ile, cache uygulama tarafından güncellenen pasif bir depolama olduğunu. yani, cache sadece bir eksikliği bildirir ve uygulama yedekleme depolamasından veri almak ve cache'yi güncellemek için sorumludur. Şekil 1, bir uygulama, uygulamanın ilgilendiği verileri belirleyen bir çerez anahtarı ile bir çerezten bir değer görüyor. Anahtar cache'de varsa, cache, uygulamanın kullanabileceği anahtarla ilişkili değeri döndürür. ancak, anahtar yoksa veya cache'de sona ermişse, uygulamanın işlemesi gereken bir cache eksikliği vardır. Bu durumda, uygulama kullanıcı kimliği tarafından kullanıcı bilgilerini veritabanından okumak için bir sorgu gerçekleştirir. veritabanından geri döndüğü kullanıcı bilgisi daha sonra cache'de depolayabileceğiniz bir biçime dönüştürülür. Daha sonra, cache, kullanıcı kimliği ile cache anahtarı ve bilgileri değer olarak güncellenir. Örneğin, bu tür bir caching gerçekleştirmenin tipik bir yolu, veritabanından geri döndüğü kullanıcı bilgilerini JSON'a dönüştürmek ve bu bilgiyi cache'de depolamaktir. Cache-aside caching, Redis gibi bir cache sunucusunu kurmak ve veritabanı sorgularını ve hizmet yanıtlarını cache etmek için kullanmak kolay olduğu için popülerdir. cache-aside caching ile, cache sunucusu pasiftir ve hangi veritabanı kullandığınızı veya sonuçların cache'ye nasıl yerleştirildiğini bilmenize gerek yoktur. Çoğu durumda, cache-side caching, uygulama gecikmesini azaltmanın basit ve etkili bir yoludur. Uygulamanızın yakınında bulunan bir cache sunucusunda en önemli bilgileri bularak veritabanına erişim gecikmesini gizleyebilirsiniz. Bununla birlikte, veri tutarlılığı veya taze gereksinimleriniz varsa, cache-side caching de sorunlu olabilir. örneğin, bir anahtarı cache'de arıyor olan birden fazla aynı anda okuyucu varsa, aynı anda cache eksiklerini nasıl işleyeceğinizi uygulamanızda koordine etmeniz gerekir; aksi takdirde, birkaç veritabanı erişimi ve cache güncelleştirmeleri ile sonuçlanabilir, bu da sonraki cache arama sonuçları farklı değerleri döndürür. Bununla birlikte, cache-side caching ile, işlem desteğini kaybedersiniz çünkü cache ve veritabanı birbirini tanımıyor ve verileri güncelleştirmek için uygulamanın sorumluluğudır. Son olarak, cache-side caching önemli bir sırt geçirmesi olabilir çünkü bazı cache aramaları, veritabanı okuma geçirmesi bir sırt geçirmesi ile karşılaşır. Bu, bir sırt geçirmesi olduğunda, erişim geçirmesi hızlıdır çünkü yakınındaki bir sırt sunucusundan geliyor; bir sırt geçirmesi birçok senaryoda şaşırtıcı derecede sık görülür. Caching aracılığıyla Read-through caching, cache-side caching'in aksine, bir cache eksikliği olduğunda cache aktif bir bileşen olduğu bir stratejidir. bir cache eksikliği olduğunda, bir read-through cache, anahtar için bir değeri otomatik olarak arama mağazasından okumaya çalışır. Latency, cache-side caching'e benzer, ancak backing store arama gecikmesi, uygulama-backing store'dan değil, dağıtım mimarisine bağlı olarak daha küçük olabilir. Şekil 2, uygulama bir anahtar üzerinde bir anahtar arama yapar ve bir anahtar eksikliği varsa, anahtar için değer elde etmek için veri tabanına bir okuma yapar. anahtar sonra kendini güncelleştirir ve değerini uygulamaya iade eder. bir uygulama bakış açısından, bir anahtar eksikliği her zaman bir anahtar eksik olup olmadığına bakılmaksızın, bir anahtar eksikliği her zaman bir anahtar iade eder. Cache, arama depolamasını okuyabilmek için daha karmaşıktır, ancak ayrıca veritabanı sonuçlarını arama depolamasının bir formatı haline dönüştürmek zorundadır. Örneğin, arama depolamasının bir SQL veritabanı sunucusu ise, arama sonuçlarını arama depolamasında depolamak için JSON veya benzer bir formata dönüştürmeniz gerekir. Bununla birlikte, cache güncelleştirmeleri koordine eder ve veritabanı okuma-gönderme ile okunur, uygulama için işlemsel garanti verebilir ve eşzamanlı cache eksikliğinde tutarlılık sağlar. Tabii ki, okuma geçişinin aynı uyarısı, okuma geçişinde olduğu gibi okuma geçişinde de geçerlidir. Bir istisna: aktif bileşenler olarak, okuma geçişleri, örneğin, güncelleştirme öncesi saklama ile daha iyi saklanabilir. Burada, okuma geçişleri, değerlerin sona ermeden önce anlık olarak güncelleştirir - dolayısıyla, bir değere sahip olduğunda, veritabanı erişim geçiş süresini tamamen gizler. Caching aracılığıyla yazılım Cache-side ve read-through caching, cache-side caching ile ilgili stratejilerdir, ancak bazen, cache'yi yazılar desteklemek için de istiyorsunuz. Böyle durumlarda, cache, uygulamanın çağırabileceği bir anahtarın değerini güncelleştirmek için bir arayüz sağlar. Cache-side caching durumunda, uygulama, backing store ile iletişim kuran tek kişidir ve bu nedenle cache'yi güncelleştirir. Ancak, read-through caching ile yazılar ile uğraşmak için iki seçenek vardır: write-through ve write-behind caching. Cache'nin güncelleştirilmesi, bir cache'nin güncelleştirildiği zaman, cache'nin cache'yi cache değeriyle senkron olarak güncelleştirir. Cache'nin yazma gecikmesinin yazma gecikmesinin, önemli olabileceğini gösteren yazma gecikmesinin hakim olduğu bir stratejidir. Şekil 3'te gösterildiği gibi, bir uygulama, bir anahtar ve bir değer çiftiyle cache tarafından sağlanan bir arayüzü kullanarak bir cache'yi güncelleştirir. Cache, durumunu yeni değere göre güncelleştirir, veritabanını yeni değere göre güncelleştirir ve veritabanının uygulama için cache güncelleştirmesini kabul etmesine kadar güncelleştirmesini bekler. Cache ve backup depolama işlemi ile ilgili bir hata oluştuğunda cache ve backup depolama işlemi ile ilgili bir hata oluştuğunda cache ve backup depolama işlemi sona erebilir. örneğin, cache yazma işlemi başarılı olursa, ancak backup depolama yazma işlemi başarısız olursa, her ikisi de senkronize olmayacaktır. Okuma-gönderme çubuğu gibi, yazma-gönderme çubuğu, çubuğun veri tabanına bağlanabileceğini ve bir çubuğun değerini bir veri tabanına sorguya dönüştürebileceğini varsayar. örneğin, kullanıcı kimliği anahtar olarak ve bir JSON belgesinin değeri temsil ettiği kullanıcı verilerini çubuğunda kullanıyorsanız, çubuğun kullanıcı bilgilerin JSON temsilini bir veri tabanında güncelleştirme yapabilmesi gerekir. Yazma aracılığıyla caching ile, en basit çözüm genellikle JSON'u veritabanında depolamaktir. yazma aracılığıyla caching'in ana dezavantajı, temel olarak veritabanı komite gecikmesi ile eşdeğer olan cache güncellemeleriyle ilişkili geçimsizliktir. Arkasında Caching Diğer bir deyişle, yazma arkasındaki bellekleme stratejisi, veri tabanını güncelleştirmeyi engelleyen yazma aracılığıyla belleği hemen güncelleştirir.Diğer bir deyişle, yazma arkasındaki bellekleme ile, bellek, yedekleme depolarını güncelleştirmeden önce birden fazla güncelleştirmeyi kabul edebilir, örneğin Şekil 4'te gösterildiği gibi, bellek veritabanını güncelleştirmeden önce üç bellek güncelleştirmesini kabul eder. Yazma arka cache yazma gecikmesi yazma arka cache yazma ile karşılaştırıldığında daha düşüktür, çünkü yedekleme mağazası eşzamanlı olarak güncellenir. Yani, yedekleme yazmayı hemen uygulamaya tanıtabilir, böylece düşük gecikme yazma sonuçlanır ve sonra arka cache güncelleştirmesini arka planda gerçekleştirir. Ancak, yazma arka cache'nin dezavantajı, işlem desteğini kaybedersiniz, çünkü yedekleme artık yedekleme ve veritabanının eşzamanlı olduğunu garanti edemez. Ayrıca, yazma arka cache, verilerin kaybolmadığını garanti edebilir. Müşteri tarafı caching Müşteri tarafında bir caching stratejisi, uygulamanızın müşteri katmanında cache olması anlamına gelir. Redis gibi cache sunucuları bellek içi caching kullanırken, uygulama Redis protokolü aracılığıyla cache'ye erişmek için ağ üzerinden iletişim kurmalıdır. Uygulama bir veri merkezinde çalışan bir hizmet ise, bir cache sunucusu caching için mükemmeldir, çünkü bir veri merkezinde ağ döngüsü hızlıdır ve cache karmaşıklığı kendi cache'de bulunur. Bununla birlikte, son kilometre gecikme hala bir cihazda kullanıcı deneyiminde önemli bir faktördür, bu yüzden müşteri tarafı caching çok karlıdır. Client-side caching ile, okuma ve yazma arkasındaki caching kombinasyonu, gecikme açısından en iyisidir, çünkü hem okuma hem de yazma hızlıdır. tabii ki, client genellikle doğrudan veritabanına bağlanamaz, bunun yerine veritabanına bir proxy veya API sunucusu aracılığıyla dolaylı olarak erişir. Client-side caching ayrıca işlemleri veritabanı erişimi dolaylı katmanları ve gecikme nedeniyle garanti etmek zordur. Düşük gecikme müşteri tarafındaki belleğe ihtiyaç duyan birçok uygulama için, replikasyon için yerel ilk yaklaşım daha pratik olabilir.Ama basit okuma belleği için, müşteri tarafındaki belleğe düşük gecikme elde etmek için iyi bir çözüm olabilir.Tabii ki, müşteri tarafındaki belleğe de bir kompromis vardır: Uygulamanın hafıza tüketimini artırabilir, çünkü belleğe alan ihtiyacınız vardır. dağıtılmış caching Şimdiye kadar, sadece tek bir cache örneğinin var olduğu gibi caching hakkında konuştuk. Örneğin, bir PostgreSQL veritabanından sorguları cache etmek için uygulama içi bir cache veya tek bir Redis sunucusu kullanıyorsunuz. Bununla birlikte, genellikle verilerin çoklu kopyalarına ihtiyacınız vardır. farklı yerlerde coğrafi gecikmeyi azaltmak veya iş yükünüzü karşılamak için genişletmek. Bu tür dağıtılmış cache ile, bağımsız olarak ya da bir cache kümesinde çalışan çok sayıda cache örneğine sahip olursunuz. dağıtılmış cache ile, 4. Bölümde replikasyon ve 5. Bölümde bölünme hakkında tartışılanlar ile aynı karmaşıklık ve düşüncelere sahip olursunuz. dağıtılmış cache ile, her örneğe tüm cache verilerini yerleştirmek istemiyorsunuz, ancak bunun yerine düğümler arasında bölünmüş cache verileri var. Benzer şekilde, yüksek kullanılabilirlik ve düşük erişim gecikmesi için çok sayıda örneğe bölünmeleri kopyalayabilirsiniz. Genel olarak, dağıtılmış kaydetme, kaydetme, bölünme ve kopyalama avantajlarının ve sorunlarının bir çerçevesidir, bu yüzden bununla ilgileniyorsanız dikkatli olun. *Şimdi Okumaya devam etmek için, ScyllaDB veya . Ücretsiz 3 Bölüm Fragmanı İndir Manning'in Tam Kitabını Satın Al Cynthia Dunlop Hakkında Cynthia, ScyllaDB'de içerik stratejisi üst düzey direktörüdür ve 20 yıldan fazla bir süredir yazılım geliştirme ve kalite mühendisliği hakkında yazıyor.