Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Veri deposundaki verileri istek üzerine önbelleğe yükleyin. Bunu yapmak, performansı geliştirebilir ve önbellekte tutulan veriler ile temel alınan veri deposundaki veriler arasında tutarlılık sağlamak için de yardımcı olabilir.
Bağlam ve sorun
Uygulamalar, veri deposunda tutulan bilgilere tekrar tekrar erişmeyi geliştirmek için bir önbelleği kullanır. Ancak, önbelleğe alınan verilerin her zaman veri deposuyla tutarlı olmasını beklemek gerçekçi değildir. Uygulamalar, önbellekteki verilerin mümkün olduğunca up-to-date olmasını sağlamaya yardımcı olan bir strateji uygulamalıdır. Strateji ayrıca önbelleğe alınan verilerin ne zaman eski olduğunu algılayabilmeli ve uygun şekilde işleyebilmelidir.
Çözüm
Birçok ticari önbelleğe alma sistemi anında okuma ve anında yazma/arka planda yazma işlemleri sağlar. Bu sistemlerde uygulama, verileri önbelleğe başvurarak alır. Veriler önbellekte değilse, uygulama verileri veri deposundan alır ve önbelleğe ekler. Önbellekte tutulan verilere yapılan tüm değişiklikler, ayrıca veri deposuna otomatik olarak geri yazılır.
Bu işlevi sağlamayan önbelleklerde verileri koruma sorumluluğu önbelleği kullanan uygulamalara aittir.
Bir uygulama, edilgen önbellek stratejisini uygulayarak anında okuyan önbellek işlevine öykünebilir. Bu strateji, verileri isteğe bağlı olarak önbelleğe yükler. Şekilde, verileri önbelleğe depolamak için Edilgen Önbellek düzeninin kullanılması gösterilmektedir.
- Uygulama, önbellekten okumaya çalışarak öğenin şu anda önbellekte tutulup tutulmadığını belirler.
- Öğe önbellekte güncel değilse (önbellek hatası), uygulama öğeyi veri deposundan alır.
- Uygulama öğeyi önbelleğe ekler ve çağırana döndürür.
Bir uygulama bilgileri güncelleştirdiğinde veri deposunda değişiklik yaparak ve ilgili öğeyi önbellekte geçersiz kılarak anında yazma stratejisini izleyebilir.
Öğeye yeniden ihtiyaç duyulduğunda, edilgen önbellek stratejisi güncelleştirilmiş verileri veri deposundan alır ve önbelleğe ekler.
Sorunlar ve dikkat edilmesi gerekenler
Bu düzenin nasıl uygulanacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:
Önbelleğe alınan verilerin ömrü. Birçok önbellek, belirli bir süre boyunca erişilmiyorsa verileri geçersiz kılıp önbellekten kaldırmak için bir süre sonu ilkesi kullanır. Edilgen önbelleğin etkili olması için süre sonu ilkesinin verileri kullanan uygulamalara yönelik erişim düzeni ile eşleştiğinden emin olun. Uygulamaların veri deposundan sürekli veri almasına ve önbelleğe eklemesine neden olabileceğinden, süre sonu süresini çok kısa yapmayın. Benzer şekilde, sona erme süresini önbelleğe alınan verilerin eskimesine yol açabilecek kadar uzun da yapmayın. Önbelleğe almanın göreceli olarak en çok statik veriler veya sık okunan veriler için etkili olduğunu unutmayın.
Verileri çıkarma. Çoğu önbellek, verilerin kaynaklandığı veri deposuyla karşılaştırıldığında sınırlı bir boyuta sahiptir. Önbellek boyut sınırını aşarsa verileri çıkartır. Çoğu önbellek, çıkarılacak öğeleri seçmek için en son kullanılan ilkeyi benimser, ancak özelleştirilebilir olabilir.
Yapılandırma. Önbellek yapılandırması hem genel olarak hem de önbelleğe alınan öğe başına ayarlanabilir. Tek bir genel çıkarma ilkesi tüm öğelere uygun olmayabilir. Bir öğenin alınması pahalıysa önbellek öğesindeki bir yapılandırma uygun olabilir. Bu durumda, daha ucuz öğelere göre daha az sıklıkta erişildiğinde bile öğeyi önbellekte tutmak mantıklıdır.
Önbelleği hazırlama. Birçok çözüm, bir uygulamanın başlatma işleminin parçası olarak gerek duyabileceği verileri önceden önbelleğe doldurur. Bu verilerin bir kısmının süresi dolduğunda ya da veriler çıkarıldığında da Edilgen Önbellek düzeni yararlı olmaya devam edebilir.
Tutarlılık. Edilgen Önbellek düzenini uygulamak, veri deposu ile önbellek arasındaki tutarlılığı garanti etmez. Örneğin, dış işlem herhangi bir zamanda veri deposundaki bir öğeyi değiştirebilir. Bu değişiklik, öğe yeniden yüklenene kadar önbellekte görünmez. Verileri veri depoları arasında çoğaltan bir sistemde, eşitleme sık sık gerçekleşirse tutarlılık zor olabilir.
Yerel (bellek içi) önbelleğe alma. Önbellek, bir uygulama örneği için yerel olabilir ve bellek içinde saklanabilir. Bir uygulama aynı verilere tekrar tekrar erişiyorsa edilgen önbellek bu ortamda yararlı olabilir. Ancak yerel önbellek özeldir ve bu nedenle, farklı uygulama örneklerinin her biri, önbelleğe alınmış aynı verilerin bir kopyasına sahip olabilir. Bu veriler hızlı bir şekilde önbellekler arasında tutarsız duruma gelebileceğinden özel önbellekte tutulan verilerin bir süre sonu olması ve daha sık yenilenmeleri gerekebilir. Bu senaryolarda, paylaşılan veya dağıtılmış önbelleğe alma mekanizması kullanımını incelemeyi dikkate alın.
Anlamsal önbelleğe alma. Bazı iş yükleri, tam anahtarlar yerine anlamsal anlam temelinde önbellek alma işlemi gerçekleştirmenin avantajlarından yararlanabilir. Bu, dil modellerine gönderilen istek ve belirteç sayısını azaltır. Önbelleğe alınan verilerin anlamsal denklik avantajından yararlandığından ve ilgisiz yanıtlar döndürme riskini almadığından veya özel ve hassas veriler içerdiğinden emin olun. Örneğin, "Yıllık maaşım ne kadardır?", "Yıllık ev ücretim nedir?" sorusuna benzer ancak iki farklı kullanıcı tarafından sorulduğunda yanıtın aynı olmaması gerekir ve bu hassas verileri önbelleğinize eklemek istemezsiniz.
Bu düzenin kullanılacağı durumlar
Bu düzeni aşağıdaki durumlarda kullanın:
- Bir önbellek yerel anında okuma ve anında yazma işlemleri sağlamaz.
- Kaynak talebi tahmin edilemez. Bu düzen uygulamaların verileri isteğe bağlı olarak yüklemelerini sağlar. Bir uygulamanın önceden hangi verileri gerektirdiğine ilişkin hiçbir varsayımda bulunmaz.
Bu düzen şu durumda uygun olmayabilir:
- Veriler hassassa veya güvenlikle ilgiliyse. Özellikle önbellek birden çok uygulama veya kullanıcı arasında paylaşılıyorsa, önbellekte depolamak uygun olmayabilir. Her zaman verilerin birincil kaynağına gidin.
- Önbelleğe alınan veri kümesi statik olduğunda. Veriler kullanılabilir önbellek alanına sığıyorsa, başlangıçtaki verileri önbelleğe alın ve verilerin süresinin dolmasını engelleyen bir ilke uygulayın.
- İsteklerin çoğu önbellek isabeti yaşamadığında. Bu durumda, önbelleği denetleme ve verileri bu önbelleğe yükleme yükü, önbelleğe almanın avantajlarından daha ağır basabilir.
- Bir web grubunda barındırılan bir web uygulamasında oturum durumu bilgilerini önbelleğe alırken. Bu ortamda, istemci-sunucu benzeşimine bağlı olan bağımlılıklar getirmekten kaçınmalısınız.
İş yükü tasarımı
Bir mimar, Azure Well-Architected Framework yapılarında ele alınan hedefleri ve ilkeleri ele almak için Cache-Aside deseninin bir tasarımda nasıl kullanılabileceğini değerlendirmelidir. Örneğin:
| Yapı Taşı | Bu desen sütun hedeflerini nasıl destekler? |
|---|---|
| Güvenilirlik tasarımı kararları, iş yükünüzün arızaya karşı dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma gelmesini sağlamaya yardımcı olur. | Önbelleğe alma, veri çoğaltması oluşturur ve kaynak veri deposu geçici olarak kullanılamıyorsa sık erişilen verilerin kullanılabilirliğini korumak için sınırlı yollarla kullanılabilir. Ayrıca önbellekte bir arıza varsa iş yükü kaynak veri deposuna geri dönebilir. - RE:05 Yedeklilik |
| Performans Verimliliği , ölçeklendirme, veri ve kod iyileştirmeleri aracılığıyla iş yükünüzün talepleri verimli bir şekilde karşılamasını sağlar. | Önbellek kabini kullanmak, seyrek değişen ve bazı eskime durumlarını tolere edebilen yoğun okuma verilerinin performansını artırır. - PE:08 Veri performansı - PE:12 Sürekli performans iyileştirme |
Herhangi bir tasarım kararında olduğu gibi, bu desenle ortaya konulabilecek diğer sütunların hedeflerine karşı herhangi bir dengeyi göz önünde bulundurun.
Örnek
Birden çok uygulama örneğinin paylaşabileceği dağıtılmış bir önbellek oluşturmak için Azure Yönetilen Redis'i kullanmayı göz önünde bulundurun.
Aşağıdaki kod örneği, .NET için yazılmış bir Redis istemci kitaplığı olan StackExchange.Redis istemcisini kullanır. Azure Yönetilen Redis örneğine bağlanmak için statik ConnectionMultiplexer.Connect yöntemi çağırın ve bağlantı dizesini geçirin. Bu yöntem, bağlantıyı temsil eden bir ConnectionMultiplexer döndürür. Uygulamanızda bir ConnectionMultiplexer örneği paylaşmaya ilişkin bir yaklaşım, aşağıdaki örneğe benzer bir bağlı örnek döndüren statik özelliğe sahip olmaktır. Bu yaklaşım yalnızca tek bir bağlı örneği başlatmak için iş parçacığı güvenli bir yol sağlar.
private static ConnectionMultiplexer Connection;
// Redis connection string information
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
return ConnectionMultiplexer.Connect(cacheConnection);
});
public static ConnectionMultiplexer Connection => lazyConnection.Value;
GetMyEntityAsync Aşağıdaki kod örneğindeki yöntemi, Cache-Aside düzeninin bir uygulamasını gösterir. Bu yöntem, okuma yaklaşımını kullanarak önbellekten bir nesne alır.
Bir nesne, anahtar olarak bir tamsayı kimliği kullanılarak tanımlanır.
GetMyEntityAsync yöntemi, bu anahtarla önbellekten öğeyi almayı dener. Eşleşen bir öğe bulunursa önbellek onu döndürür. Önbellekte bir eşleşme yoksa GetMyEntityAsync yöntemi nesneyi veri deposundan alır, önbelleğe ekler ve ardından onu döndürür. Veri deposundaki verileri okuyan kod, veri deposuna bağlı olduğundan burada gösterilmez. Önbelleğe alınan öğenin süresi, başka bir hizmet veya işlem tarafından güncelleştirildiğinde eskimesini önlemek için yapılandırılır.
// Set five minute expiration as a default
private const double DefaultExpirationTimeInMinutes = 5.0;
public async Task<MyEntity> GetMyEntityAsync(int id)
{
// Define a unique key for this method and its parameters.
var key = $"MyEntity:{id}";
var cache = Connection.GetDatabase();
// Try to get the entity from the cache.
var json = await cache.StringGetAsync(key).ConfigureAwait(false);
var value = string.IsNullOrWhiteSpace(json)
? default(MyEntity)
: JsonConvert.DeserializeObject<MyEntity>(json);
if (value == null) // Cache miss
{
// If there's a cache miss, get the entity from the original store and cache it.
// Code has been omitted because it is data store dependent.
value = ...;
// Avoid caching a null value.
if (value != null)
{
// Put the item in the cache with a custom expiration time that
// depends on how critical it is to have stale data.
await cache.StringSetAsync(key, JsonConvert.SerializeObject(value)).ConfigureAwait(false);
await cache.KeyExpireAsync(key, TimeSpan.FromMinutes(DefaultExpirationTimeInMinutes)).ConfigureAwait(false);
}
}
return value;
}
Örneklerde depoya erişmek ve önbellekten bilgi almak için Azure Managed Redis kullanılır. Daha fazla bilgi için bkz. Azure Yönetilen Redis oluşturma ve .NET Core'da Azure Redis'i kullanma.
Aşağıda UpdateEntityAsync gösterilen yöntem, uygulama değeri değiştirdiğinde önbellekteki bir nesnenin nasıl geçersiz kılınduğunu gösterir. Bu kod özgün veri deposunu güncelleştirir ve sonra önbelleğe alınan öğeyi önbellekten kaldırır.
public async Task UpdateEntityAsync(MyEntity entity)
{
// Update the object in the original data store.
await this.store.UpdateEntityAsync(entity).ConfigureAwait(false);
// Invalidate the current cache object.
var cache = Connection.GetDatabase();
var id = entity.Id;
var key = $"MyEntity:{id}"; // The key for the cached object.
await cache.KeyDeleteAsync(key).ConfigureAwait(false); // Delete this key from the cache.
}
Not
Adımların sırası önemlidir. Öğeyi önbellekten kaldırmadan önce veri deposunu güncelleştirin. Önce önbelleğe alınan öğeyi kaldırırsanız, istemcinin veri deposu güncelleştirilmeden önce öğeyi getirebileceği küçük bir zaman penceresi vardır. Bu durumda, getirme sonucunda önbellek eksik olur (öğe önbellekten kaldırıldığı için). Önbellek hatası, öğenin önceki sürümünün veri deposundan alınmasına ve önbelleğe geri eklenmesine neden olur. Sonuç eski önbellek verileridir.
İlgili kaynaklar
Bu desen uygulanırken aşağıdaki bilgiler ilgili olabilir:
Güvenilir web uygulaması deseni , bulutta yakınsanan web uygulamalarına önbelleğe alma düzeninin nasıl uygulanacağını gösterir.
Önbelleğe Alma Kılavuzu. Verileri bir bulut çözümünde önbelleğe nasıl alabileceğiniz ve önbelleği uygularken dikkate almanız gereken sorunlar hakkında ek bilgiler verir.
Veri Tutarlılığı Temel Bilgileri. Bulut uygulamaları genellikle verileri birden çok veri deposunda ve konumda depolar. Bu ortamda veri tutarlılığını yönetmek ve korumak, sistemin, özellikle de ortaya çıkabilecek eşzamanlılık ve kullanılabilirlik sorunlarının kritik bir yönüdür. Bu temel bilgiler, dağıtılmış veriler arasındaki tutarlılıkla ilgili sorunları açıklar ve bir uygulamanın verilerin kullanılabilirliğini sürdürmek için nihai tutarlılığı nasıl uygulayabileceğini özetler.
Azure Yönetilen Redis'i anlamsal önbellek olarak kullanın. Bu öğreticide, Azure Yönetilen Redis kullanarak anlamsal önbelleğe alma işleminin nasıl gerçekleştirilmeye çalışılması gösterilmektedir.