Bunları önbelleğe al

Yazar hakkında: Meituan Dianping'in likör ve seyahat işletme grubunun otel konaklama Ar-Ge ekibinin B-end ticaret platformu başkanı Xiong Minghui, Meituan Dianping'in otel konaklama işinin hızlı gelişimini desteklemek için tüccar iş platformu sisteminin yapımına öncülük etti. Daha önce Lenovo Group ve Baidu'da çalıştı.

Giriş: Ağ katmanlı uygulama hizmetinde, önbelleğe alma kullanımı daha popüler hale geldi. Bu makale, yazarın gerçek iş deneyimini özetleyecek ve hizmet kalitesini iyileştirmek ve sistem mimarisini optimize etmek için farklı senaryolarda uygun önbelleğe alma çerçevesinin nasıl seçilip kullanılacağını açıklayacaktır. Amacı.

Genel olarak, mevcut İnternet modelinde (bir web sitesi veya bir uygulama), genel süreç, tarayıcı uygulama sunucusu veritabanı veya dosya (depolama) uygulama sunucusu tarayıcı olarak özetlenebilir, bu, tarayıcı aracılığıyla standart bir işlemdir ( Veya Uygulama arayüzü) bir istek başlatır ve sunucu ve veritabanının hesaplanması ve entegrasyonundan sonra tarayıcı tarafından sunulan içeriği geri bildirimde bulunur. İnternetin yaygınlaşması ile içerik ve bilgi giderek daha karmaşık hale geliyor, kullanıcı ve ziyaret sayısı artıyor.Uygulamalarımızın daha fazla eşzamanlılığı desteklemesi gerekiyor.Aynı zamanda uygulama sunucularımız ve veritabanı sunucularımız tarafından yapılan hesaplamalar da artıyor. birçok. Ancak çoğu zaman uygulama sunucusu kaynaklarımız sınırlıdır ve teknolojik değişiklikler yavaştır, veritabanının saniyede kabul edebileceği istek sayısı da sınırlıdır (veya dosya okuma ve yazma işlemleri de sınırlıdır), en iyisini sağlamak için sınırlı kaynakları etkili bir şekilde nasıl kullanabiliriz Muhtemelen büyük iş hacmi? Etkili bir yol, hesaplama miktarını azaltmak ve istek sürecini kısaltmaktır - bu, önbelleğe almaktır. Önbelleğin ortaya çıkışı, yukarıda belirtilen, herhangi bir bağlantısı kesilebilen standart süreci kırmaktır ve istek, hedef verileri doğrudan önbellekten alıp geri döndürebilir. Geleneksel yöntemden bu kopuş sayesinde, hesaplama miktarı etkili bir şekilde azaltılır, talep süreci kısaltılır, yanıt hızı etkin bir şekilde iyileştirilir, donanım kaynakları kaydedilir ve sınırlı kaynaklar daha fazla kullanıcıya hizmet edebilir.

Şekil 1'de gösterildiği gibi, önbelleğe alma kullanımı 1-4 arasındaki her bağlantıda görünebilir ve önbelleğe alma şeması ve her bağlantının kullanımının kendi özellikleri vardır.

Şekil 1 Ağ uygulamasının genel süreci

Önbellek özellikleri

Nesne yönelimli yazılım düşüncesine göre, önbellek bir nesne türüdür, bu nedenle özelliklerine sahip olması gerekir:

İsabet oranı

İsabet oranı = döndürülen doğru sonuçların sayısı / önbellek isteklerinin sayısı İsabet oranı önbellekte çok önemli bir sorundur ve önbelleğin etkinliğini ölçmek için önemli bir göstergedir. İsabet oranı ne kadar yüksekse, önbelleğin kullanım oranı o kadar yüksek olur.

Maksimum öğe (veya maksimum alan)

Önbellekte saklanabilecek maksimum öğe sayısı. Önbellekteki öğe sayısı bu değeri aştığında (veya önbelleğe alınan verilerin kapladığı alan maksimum destek alanını aştığında), önbellek boşaltma stratejisini başlatmak için tetiklenir. Maksimum öğe değerini farklı senaryolara göre makul bir şekilde ayarlayın Genellikle önbellek isabet oranını bir dereceye kadar artırabilir, böylece önbellek daha etkili olur.

Boş strateji

Yukarıda açıklandığı gibi, önbelleğin depolama alanı sınırlıdır Önbellek alanı dolduğunda, hizmetin stabilize olması ve isabet oranının etkili bir şekilde artırılması nasıl sağlanır? Bu, önbellek boşaltma stratejisiyle gerçekleştirilir ve kendi verilerinizin özelliklerine uygun bir strateji tasarlamak, isabet oranını etkili bir şekilde artırabilir. Yaygın genel stratejiler şunlardır:

a. FIFO (ilk giren ilk çıkar)

İlk giren ilk çıkar stratejisi, önbellek alanı yeni verilere yer açmak için yetersizse (maksimum öğe sınırını aşıyorsa) önce önbelleğe giren ilk veriler temizlenir. Strateji algoritması esas olarak önbellek öğelerinin oluşturulma zamanını karşılaştırır.

b. LFU (daha az sıklıkla kullanılır)

En az kullanılan strateji, süresinin dolup dolmadığına bakılmaksızın, öğenin kaç kez kullanıldığına göre değerlendirilir ve daha az sıklıkla kullanılan öğeler, yer açmak için kaldırılır. Strateji algoritması esas olarak öğelerin hitCount'unu karşılaştırır.

c. LRU (en az kullanılan)

En son kullanılan strateji, süresinin dolup dolmadığına bakılmaksızın, öğenin en son kullanıldığı zaman damgasına göre, alanı boşaltmak için öğeleri en son kullanılan zaman damgasıyla temizler. Strateji algoritması esas olarak öğenin get tarafından en son kullanıldığı zamanı karşılaştırır.

Ek olarak, aşağıdaki gibi bazı basit stratejiler vardır:

Son kullanma süresine göre, en uzun son kullanma süresine sahip öğeleri temizleyin;

Son kullanma süresine göre, yakın zamanda sona erecek öğeleri temizleyin;

Rastgele temizlik

Anahtar kelimelerin uzunluğuna (veya öğe içeriğine) vb. Göre temizleyin.

Önbellek ortamı

(Donanım ortamı açısından, bellek ve sabit diskten başka bir şey değildir.) Teknik olarak, birkaç türe ayrılabilir: bellek, sabit disk dosyaları ve veritabanları.

  • Bellek: Önbelleği bellekte saklamak ek G / Ç ek yükü olmadan en hızlı seçenektir, ancak belleğin dezavantajı kalıcı fiziksel diskin olmamasıdır.Uygulama anormal bir şekilde bozulduğunda, verileri yeniden başlatmak zordur veya geri yüklenmesi imkansızdır.

  • Sabit disk: Genel olarak konuşursak, birçok önbellek çerçevesi bellek ve sabit diski birlikte kullanır.Hafıza ayırma alanı dolduğunda veya anormal olduğunda, bellek alanındaki veriler, alanı serbest bırakmak veya yedeklemek için pasif veya aktif olarak sabit diske devam edebilir. Verilerin amacı.

  • Veritabanı: Daha önce de bahsettiğimiz gibi, önbellek stratejisini artırmanın amaçlarından biri veritabanının G / Ç baskısını azaltmaktır. Veritabanlarının önbellek ortamı olarak kullanılması artık eski soruna mı dönüyor? Aslında, SQL'i desteklemeyen ancak basit anahtar ve değer depolama yapılarına sahip özel veritabanları (berkleydb gibi) gibi birçok veritabanı türü vardır.Yanıt hızı ve verimi, yaygın olarak kullanılan ilişkisel veritabanlarımızdan çok daha yüksektir.

Mevcut uygulama hizmeti çerçevesinde, önbellek sınıflandırması daha yaygın olarak önbellek ve uygulama arasındaki bağlantı derecesine göre kullanılır ve yerel önbellek (yerel önbellek) ve uzak önbellek (dağıtılmış önbellek) olarak bölünür:

  • Yerel önbellek: Uygulamadaki önbelleğe alma bileşenini ifade eder.Bunun en büyük avantajı, uygulama ile önbelleğin aynı süreçte olması ve istek önbelleğinin çok hızlı olması, aşırı ağ yükü vb. Olmamasıdır, tek bir uygulamada küme desteği veya küme gerektirmez Düğümlerin birbirlerine bildirimde bulunmasına gerek olmadığı durumlarda yerel önbellek kullanmak daha uygundur; aynı zamanda önbelleğin uygulama ile birleştirilmesi gerekmesi, birden fazla uygulamanın önbelleği doğrudan paylaşamaması ve kümedeki her uygulamanın veya her düğümün bakımının yapılması gerekmesidir. Kendi ayrı önbelleğiniz bir hafıza kaybıdır.

  • Uzak önbellek: Uygulamadan ayrılmış bir önbellek bileşeni veya hizmeti ifade eder.Bunun en büyük avantajı, yerel uygulamadan izole edilmiş bağımsız bir uygulama olması ve birden fazla uygulamanın önbelleği doğrudan paylaşabilmesidir.

Şu anda binlerce uygulama hizmetinde çeşitli önbellekleme türleri aktif durumdadır.Tüm iş senaryolarını veya veri türlerini çözebilecek bir önbellekleme çözümü yoktur.Kendi özel senaryolarımıza ve geçmişimize göre en uygun önbellekleme çözümünü seçmemiz gerekiyor. . Önbellek kullanımı, programcılar ve mimarlar için gerekli bir beceridir.İyi programcılar, veri türleri ve iş senaryolarına göre hangi tür önbelleğin kullanılacağını ve en düşük maliyetle en hızlı verimi elde etmek için bu önbelleğin nasıl kullanılacağını doğru bir şekilde belirleyebilir. Optimal amaç.

Yerel önbellek

Programlı önbellek uygulaması

a. Üye değişken veya yerel değişken uygulaması

Basit bir kod örneği Şekil 2'de gösterilmektedir.

Şekil 2 Basit kod örnek diyagramı

İş verilerinin bir kısmı, sık tekrarlanan veritabanı I / O işlemlerini azaltmak için yerel değişken harita yapısı ile önbelleğe alınır. Dezavantaj, sınıfın kendi kapsamı ile sınırlıdır ve önbellek, sınıflar arasında paylaşılamaz.

b. Statik değişken uygulaması

En yaygın olarak kullanılan tekil, statik kaynak önbelleğe almayı uygular. Kod örneği aşağıdaki gibidir:

public class CityUtils {

İşletmede yaygın olarak kullanılan şehrin temel temel bilgileri yargılanır ve statik değişkenler, bir seferde önbelleği elde etmek için kullanılır, bu da sık G / Ç okumasını azaltır.Statik değişkenler sınıflar arasında ve süreç içinde paylaşılabilir ve önbelleğin gerçek zamanlı performansı biraz daha kötüdür.

Yerel olarak önbelleğe alınan verilerin gerçek zamanlı sorununu çözmek için şu anda çok sayıda kullanım, yerel statik değişken önbelleğini gerçek zamanlı olarak değiştirmek için ZooKeeper'ın otomatik keşif mekanizmasıyla birleştirilmiştir:

MtConfig'in temel bileşenleri, Şekil 3'te gösterildiği gibi, önbelleği dinamik olarak otomatik olarak güncellemek için ZooKeeper'in birleşik yönetimi ile birlikte statik değişken önbelleğe almayı kullanan benzer bir ilkeyi kullanır.

Şekil 3 Mtconfig uygulama diyagramı

Bu tür önbellek uygulamasının avantajı, en hızlı ve en uygun olan doğrudan yığın alanında okunup yazılabilmesidir; dezavantajı da yığın alanından etkilenmesi, önbelleğe alınan veri miktarının çok sınırlı olması ve önbellek süresinin GC'den etkilenmesidir. Temelde bağımsız senaryodaki küçük veri önbelleği gereksinimini karşılar ve aynı zamanda, yukarıdaki genel yapılandırma yönetimi, temel statik veriler ve diğer senaryolar gibi önbelleğe alınan verilerdeki değişikliklere karşı çok hassas olması gerekmez.

EhCache

Ehcache, basit konfigürasyonu, açık yapısı ve güçlü işlevleri ile en popüler saf Java açık kaynak önbelleğe alma çerçevesidir. Çok hafif bir önbellek uygulamasıdır. Yaygın olarak kullandığımız Hibernate, ilgili önbelleğe alma işlevlerini entegre eder.

Şekil 4 ehcache çerçeve diyagramı

Şekil 4'ten ehcache'nin temel tanımının esas olarak şunları içerdiğini anlayabiliriz:

Önbellek yöneticisi: Önbellek yöneticisi, daha önce yalnızca tekil izin veriliyordu, ancak artık birden çok örneğe sahip olabilir.

Önbellek: Verinin özünü depolamak için önbellek yöneticisine birkaç önbellek yerleştirilebilir.Tüm önbellekler, Ehcache arayüzünü uygular. Bu gerçek bir önbellek örneğidir; önbellek yöneticisi modu aracılığıyla, tek bir uygulamada birden çok önbellek kolayca izole edilebilir Örnekler, farklı iş senaryolarının gereksinimlerine bağımsız olarak hizmet eder, önbellek verilerinin fiziksel izolasyonu ve gerektiğinde paylaşımlı kullanım.

öğe: Tek bir önbellek verisinin kurucu birimi.

kayıt sistemi (SOR): gerçek verileri alabilen bileşenler, bunlar gerçek iş mantığı, harici arayüz aramaları, gerçek verileri depolayan veritabanları vb. olabilir. Önbellek SOR'dan okunur veya SOR'a yazılır.

Üst katmandan, ehcache'nin tamamının JSR, JMX vb. İçin standart destek sağladığı, daha uyumlu ve aktarılabilen ve çeşitli nesneler için daha eksiksiz bir izleme ve yönetim mekanizmasına sahip olduğu görülebilir. Önbellek ortamı, yığın belleği (yığın), yığın dışı bellek (BigMemory ticari sürüm desteği) ve diski kapsar ve her ortam, öznitelikler ve ilkelerle bağımsız olarak ayarlanabilir. Ehcache, başlangıçta bağımsız bir yerel önbellek çerçeve bileşeniydi. Daha sonraki geliştirmede, Terracotta hizmet dizisi modeli ile birleştirildiğinde, dağıtılmış önbellek kümelerini destekleyebilir. Şekil 4'te gösterildiği gibi, düğümler arası iletişim için esas olarak RMI, JGroups, JMS ve Önbellek Sunucusu yayma yöntemleri vardır. Açıklamanın sol kısmı.

Genel veri akışı birkaç tür davranış içerir:

  • Flush: Önbellek girişi daha düşük bir seviyeye taşınır.

  • Hata: Bir nesneyi alt katmandan üst katmana kopyalayın. Önbelleği elde etme sürecinde, belirli bir katman önbellek girişinin geçersiz olduğunu tespit etti ve Hata davranışını tetikledi.

  • Tahliye: Önbellek girişini kaldırın.

  • Sona Erme: Başarısızlık durumu.

  • Sabitleme: Önbellek girişlerini belirli bir seviyede kalmaya zorlayın.

Şekil 5, her katman arasındaki veri akışını ve ayrıca her bir veri katmanının yaşam döngüsünü yansıtır. Ehcache yapılandırmasına ve kullanımına bir göz atalım:

< ehcache >

Genel olarak, ehcache kullanımı nispeten basit ve kullanışlıdır ve eksiksiz bir API arayüzleri yelpazesi sağlar. Ehcache disk kalıcılığını desteklese de, iki seviyeli önbellek ortamının varlığı nedeniyle, birinci düzey bellekteki önbellek, disk kalıcılığına etkin yanıp sönme yoksa, yine de anormal uygulama çökmesi gibi durumlarda kullanılacaktır. Önbellekte veri kaybı olabilir.Bu nedenle, gerektiğinde önbelleği diske temizleyebilirsiniz ve önbellek girişini diske boşaltma işlemi cache.flush yöntemi ile gerçekleştirilebilir.Nesnenin disk yazımı için öncül olduğu unutulmamalıdır. Nesneyi serileştirmek için.

Ana Özellikler:

  • Hızlı, büyük ölçekli yüksek eşzamanlı sistem senaryoları için ehcache'nin çoklu iş parçacığı mekanizması buna göre optimize edildi ve iyileştirildi.

  • Basit, küçük jar paketi, basit yapılandırma, tek başına bir senaryoda çok sayıda başka hizmet bağımlılığı olmadan doğrudan kullanılabilir.

  • Birden çok önbelleğe alma stratejisini destekler ve esnektir.

  • İki veri önbelleği düzeyi vardır: bellek ve disk Genel yerel bellek önbelleği ile karşılaştırıldığında, diskin depolama alanı ile daha büyük miktarda veri önbelleği gereksinimlerini destekleyebilir.

  • Önbellek ve önbellek yöneticisinin dinleme arayüzü ile, önbellek örneğinin izlenmesi ve yönetimi daha basit ve rahat bir şekilde gerçekleştirilebilir.

  • Birden çok önbellek yöneticisi örneğini ve bir örneğin birden çok önbellek alanını destekler.

Not: ehcache'nin zaman aşımı ayarı, esas olarak tüm önbellek örneği için genel zaman aşımı politikasını ayarlamak içindir, ancak tek tek anahtarlar için ayrı zaman aşımı ayarlarıyla ilgilenmez (politika ayarları vardır, ancak daha karmaşıktır, bu nedenle açıklanmazlar). Kullanımda, süresi dolan ve geçersiz önbellek öğelerinin GC tarafından geri dönüştürülemeyeceği unutulmamalıdır.Süresi ne kadar uzun olursa, önbellek o kadar fazla, bellek kullanımı o kadar büyük ve bellek sızıntısı olasılığı o kadar büyük olur.

Guava Önbelleği

Guava Cache, Google'ın açık kaynak java yeniden kullanım araç seti kitaplığındaki bir önbelleğe alma aracıdır. Uyguladığı ana önbellek işlevleri şunlardır:

  • Giriş düğümünü önbellek yapısına otomatik olarak yükleyin;

  • Önbelleğe alınan veriler ayarlanan maksimum değeri aştığında, kaldırmak için LRU algoritmasını kullanın;

  • Giriş düğümünü en son erişildiği veya yazıldığı zamana göre hesaplamak için bir sona erme mekanizmasına sahiptir;

  • Önbelleğe alınan anahtar, WeakReference referansı içinde kapsüllenir;

  • Önbelleğe alınan değer, WeakReference veya SoftReference referanslarında kapsüllenir;

  • Önbelleğin kullanımı sırasında isabet oranı, anormal oran ve ıskalama oranı gibi istatistikleri hesaplayın.

Şekil 5 Guavacache'nin veri yapısı diyagramı

Guava Cache'in mimari tasarımı ConcurrentHashMap'ten ilham alır.Daha önce de bahsettiğimiz gibi, basit senaryolarda kendinizi kodlayabilir ve hashmap aracılığıyla az miktarda veriyi önbelleğe alabilirsiniz, ancak sonuç zamanla değişebilir veya depolamak istediğiniz veri alanı kontrol edilebilir ise Yine de bu veri yapısını kendiniz uygulamanız gerekmektedir.

Guava Cache, ConcurrentHashMap fikrini devralır ve iş parçacığı güvenliğini sağlarken yüksek eşzamanlılık senaryolarını desteklemek için birden çok segmentte ince taneli kilitler kullanır. Önbellek, Map'e benzer. Anahtar-değer çiftlerinden oluşan bir koleksiyondur. Aradaki fark, aynı zamanda tahliye, sona erme ve dinamik yükleme gibi algoritma mantığını işlemesi ve bu işlemleri uygulamak için bazı ek bilgiler gerektirmesidir. Bu bağlamda, nesne yönelimli düşünceye göre, yöntemleri ve veri kapsüllemeyi ilişkilendirmek gerekir. Şekil 6, önbelleğin bellek veri modelini göstermektedir.ReferenceEntry arayüzünün bir anahtar-değer çiftini kapsüllemek için ve ValueReference'ın Değer değerini kapsüllemek için kullanıldığı görülmektedir.Referans komutunun kullanılmasının nedeni, Önbelleğin WeakReference Key ve SoftReference ve WeakReference değerlerini desteklemesidir. .

Şekil 6 Önbelleğe alınmış veri akış şeması

ReferenceEntry, bir anahtar-değer çifti düğümünün bir soyutlamasıdır. ValueReference soyut anahtar ve değer sınıfını içerir. Önbellek birden çok segmentten oluşur ve her segment bir ReferenceEntry dizisi içerir ve her ReferenceEntry dizisi öğesi bir ReferenceEntry zinciridir ve Bir ReferenceEntry anahtar, hash, valueReference ve sonraki alanları içerir. Bir segmentte ReferenceEntry dizi öğelerinde oluşturulan zincire ek olarak, tüm ReferenceEntry'ler ayrıca bir erişim zinciri (accessQueue) ve bir yazma zinciri (writeQueue) oluşturur (zincirin rolü daha sonra tanıtılacaktır). ReferenceEntry güçlü bir başvuru türü anahtarı veya WeakReference türü anahtarı olabilir. Bellek kullanımını azaltmak için expireAfterWrite, expireAfterAccess ve maximumSize'ın yapılandırılıp yapılandırılmadığına göre bir yazma zincirine ve bir erişim zincirine ihtiyacınız olup olmadığını da belirleyebilirsiniz. Oluşturulacak belirli Referansı belirleyin: StrongEntry , StrongWriteEntry, StrongAccessEntry, StrongWriteAccessEntry, vb.

ValueReference için, Cache güçlü bir şekilde başvurulan Değer, SoftReference Değeri ve ZayıfReference Değerini desteklediğinden, üç uygulama sınıfına karşılık gelir: StrongValueReference, SoftValueReference ve WeakValueReference. Dinamik yükleme mekanizmasını desteklemek için ayrıca bir LoadingValueReference'a da sahiptir.Bir anahtarın değerinin dinamik olarak yüklenmesi gerektiğinde, anahtara karşılık gelen değerin zaten yüklendiğini ifade etmek için değer LoadingValueReference içinde kapsüllenir. Anahtara karşılık gelen değer referansı alabilir ve değerin yalnızca bir kez yüklenmesini sağlamak için değiştirilen değerin yüklenmesinin tamamlanmasını bekleyebilir.Değer yüklendikten sonra, LoadingValueReference'ı diğer ValueReference türleriyle değiştirin. ReferenceEntry değeri ValueReference nesnesinde tutulur. Bunun nedeni, Değer WeakReference ve SoftReference nedeniyle geri dönüştürüldüğünde, ilgili öğeyi segment tablosundan kaldırmak için anahtarın kullanılması gerektiğidir.

WriteQueue ve AccessQueue: En az kullanılan algoritmayı elde etmek için Guava Cache Segment'e iki zincir ekledi: yazma zinciri (writeQueue) ve erişim zinciri (accessQueue), her iki zincir de ReferenceEntry'deki öncekiInWriteQueue aracılığıyla çift bağlantılı bir listedir, NextInWriteQueue, previousInAccessQueue ve nextInAccessQueue ile bağlantılıdır, ancak Queue biçiminde ifade edilir. Hem WriteQueue hem de AccessQueue, teklif, ekleme (doğrudan arama teklifi), kaldırma, anket vb. Mantığı ile özelleştirilir. Teklif (ekleme) işlemi için, yeni eklenen bir düğüm ise, eğer varsa doğrudan zincirin sonuna eklenecektir. Mevcut bir düğüm için zincirin ucu düğüme bağlıdır; kaldırma işlemi için düğüm doğrudan zincirden çıkarılır; yoklama işlemi için baş düğümün sonraki düğümü kaldırılır ve geri döndürülür.

Önbelleğin genel veri yapısını anladıktan sonra, önbellek için ilgili işlemlere bakmak çok daha basittir:

Segmentteki tahliye takas stratejisi işlemi, her arama işleminin başında ve sonunda takas çalışmasını tetikler, bu da genel önbellek ve iş parçacığı izleme ve temizlemeye kıyasla ek yükü azaltabilir, ancak yöntem uzun süre çağrılmazsa, Zaman içinde bellek alanını temizleyememe ve serbest bırakamama sorununa neden olur. evict esas olarak dört Kuyruk ile ilgilenir: 1. keyReferenceQueue; 2. valueReferenceQueue; 3. writeQueue; 4. accessQueue. WeakReference ve SoftReference çöp toplandığında ilk iki sıra eklenir.Temizlerken, yalnızca tüm kuyruğu geçmeniz ve karşılık gelen öğeleri LocalCache'den kaldırmanız gerekir.Burada, keyReferenceQueue ReferenceEntry'yi ve valueReferenceQueue, ValueReference'ı depolar. Önbellek kaldırma bir anahtar gerektirir, bu nedenle ValueReference, daha önce de bahsedildiği gibi ReferenceEntry'e bir başvuru gerektirir. Son iki Kuyruk için, yalnızca ilgili sona erme süresinin yapılandırılıp yapılandırılmadığını kontrol etmeniz ve ardından süresi dolmuş Girişi baştan aramanız ve kaldırmanız gerekir.

Segmentte yerleştirme işlemi: Yerleştirme işlemi nispeten basittir. İlk önce kilidi alması ve ardından bazı temizleme çalışmaları yapması gerekir. Aşağıdaki mantık, konumu bulmak ve verileri enjekte etmek için ConcurrentHashMap'te yeniden çalıştırmaya benzer. Mevcut bir Giriş bulunduğunda, öncelikle mevcut ValueRefernece'deki değerlerin gerçekten geri dönüştürülmüş olduğunun belirlenmesi gerektiğine dikkat edilmelidir, çünkü bunlar WeakReference ve SoftReference türleri olabilir.Geri dönüştürülmüşlerse, yeni değer yazılır. . Ve her güncellemede mevcut işlemin neden olduğu kaldırma olayını kaydedin ve ilgili nedeni belirtin: TOPLANDI, DEĞİŞTİRİLDİ, vb. Bu kayıtlı olaylar, çıktıklarında Önbellek kayıtlı Kaldırma Listesini çağırır. Olay işleme uzun sürebileceğinden, Bu nedenle, olay işlemenin mantığı kilitten çıktıktan sonra burada yapılır. Son olarak, mevcut Girişi güncelledikten sonra, süresi dolmuş Girişi kaldırmayı deneyin. Ek olarak, writeQueue ve accessQueue'nun anlamsal doğruluğunun, koyma işleminde güncellenmesi gerekir.

CacheLoader ile segment alma işlemi: 1. Önce tabloda geri dönüştürülmemiş veya süresi dolmuş bir giriş olup olmadığını öğrenin. Bulunursa, CacheBuilder'da yenilemeAfterWrite yapılandırılır ve olay geçerli zaman aralığında çalıştırılmışsa, değer yeniden yüklenecektir. , Aksi takdirde, orijinal değeri doğrudan döndürün; 2. Bulunan ValueReference LoadingValueReference ise, LoadingValueReference'ın yüklenmesinin bitmesini bekleyin ve yüklenen değeri geri getirin; 3. Giriş bulunamazsa veya bulunan girişin değeri, Kilitten sonra, tablodaki mevcut anahtara karşılık gelen girişi bulmaya devam edin. Bulunursa ve karşılık gelen girdi.isLoading doğruysa, başka bir iş parçacığı yükleniyor demektir, bu nedenle bu iş parçacığının yüklenmesini bekler. Bir değer bulunmazsa, onu geri getirin Değer, aksi takdirde bir LoadingValueReference oluşturun ve karşılık gelen değeri yüklemek için loadSync'i çağırın. Yükleme tamamlandıktan sonra, yeni yüklenen değeri tabloya güncelleyin, yani çoğu durumda orijinal LoadingValueReference'ı değiştirin.

Guava Cache, Oluşturucu modunda bir CacheBuilder oluşturucu sağlayarak çok kullanışlı bir önbellek oluşturur ve her önbellek parametresinin yapılandırma ayarları işlevsel programlama yöntemine benzer ve çeşitli parametre seçimleri kendi başlarına ayarlanabilir. Önbelleğe yüklemek için üç yol sağlar. Onlar:

  • Önbelleği oluştururken, verileri yüklemek için CacheLoader yöntemini çağırmak için build yöntemini kullanın;

  • Verileri çağrılabilir ve geri çağırma yöntemlerinde yükleyin.

Şekil 7 Memcached bellek yapısı diyagramı

Verileri doğrudan Cache.put'tan yüklemek için ham ve doğrudan yöntemi kullanın, ancak önbelleğe alınan tüm içeriklerin tutarlılığını daha kolay bir şekilde çıkarabildiği için otomatik yükleme tercih edilir.

Yapı oluşturucunun her iki yöntemi de bir mantık uygular: anahtarın değerini önbellekten alır, değer önbelleğe alınmışsa değeri önbellekte döndürür, önbelleğe alınmamışsa bu değeri belirli bir yöntemle alabilirsiniz. Aradaki fark, önbellek tanımının nispeten geniş olmasıdır ve tüm önbellek için tanımlanır.Anahtar değerine dayalı birleşik bir yük değeri yöntemi olarak düşünülebilirken, çağrılabilir yöntem daha esnektir ve alma sırasında yükleme yöntemini belirlemenize olanak tanır. Kullanım örnekleri aşağıdaki gibidir:

/ ** * CacheLoader * / public void loadingCache {LoadingCache < string, string = "" > graphs = CacheBuilder.newBuilder .maximumSize (1000) .build (yeni CacheLoader < string, string = "" > {@Override

Genel olarak Guava Cache, ConcurrentHashMap'in mükemmel tasarımına dayanır ve yüksek eşzamanlılık senaryoları ve iş parçacığı güvenliğini desteklemek için ilgili iyileştirme stratejilerine sahiptir.Yüksek eşzamanlılık altında verileri iyileştirmek için Referans komutlarını kullanma ... Erişim hızı ve GC kullanılabilirliğini sürdürme Geri dönüşüm etkili bir şekilde yerden tasarruf sağlar; aynı zamanda yazma zinciri ve erişim zincirinin tasarımı, kapasite bazlı temizleme, zaman bazlı temizleme, referans bazlı temizleme vb. Dahil olmak üzere çok sayıda önbellek temizleme stratejisini daha esnek ve verimli bir şekilde gerçekleştirebilir; programlı Yapı oluşturucu yönetimi, kullanıcılara daha fazla özgürlük sağlar ve farklı senaryolara göre uygun modları ayarlayabilir.

Dağıtılmış önbellek

memcached önbellek

Memcached, daha yaygın olarak kullanılan açık kaynaklı önbellek kaldırma ürünlerinden biridir, aslında dağıtılmış bir çözüm sağlamaz. Sunucu tarafında, memcached küme ortamı aslında memcached sunucularından oluşan bir yığıntır ve ortamın oluşturulması nispeten basittir; dağıtılmış önbellek esas olarak istemci tarafında gerçekleştirilir ve dağıtılmış çözümün amacı, istemci tarafının yönlendirme süreci aracılığıyla elde edilir. İstemci yönlendirme ilkesi çok basittir.Uygulama sunucusu bir anahtarın değerine her eriştiğinde, anahtarı belirli bir algoritma aracılığıyla memcached sunucu düğümüne A eşler, böylece bu anahtardaki tüm işlemler düğümA üzerindedir. Yapı şeması aşağıdaki gibidir. Şekil 7, Şekil 8'de gösterildiği gibi.

Memcached istemcisi, Şekil 8'de gösterildiği gibi, yönlendirme stratejisi olarak tutarlı bir karma algoritma kullanır. Genel karma algoritma (basit modulo gibi) algoritmasıyla karşılaştırıldığında, tutarlı karma algoritma yalnızca anahtarın karma değerini hesaplamakla kalmaz, aynı zamanda her sunucuya karşılık gelen karmayı da hesaplar. Değer ve ardından bu karma değerleri sınırlı bir değer aralığıyla (0 ~ 2 ^ 32 gibi) eşleyin. Anahtar verileri depolamak için hedef sunucu olarak, hash değeri karma (anahtar) değerinden büyük olan en küçük sunucuyu arayarak. Bulunmazsa, en küçük hash değerine sahip sunucu doğrudan hedef sunucu olarak kullanılır. Aynı zamanda, genişleme problemi bir dereceye kadar çözülür.Tek bir düğümün eklenmesi veya silinmesinin tüm küme üzerinde büyük bir etkisi olmayacaktır. En son sürümde, kullanılabilirliği daha da artırmak için sanal düğümlerin tasarımı eklenmiştir.

Şekil 8 Memcached istemci yönlendirme şeması

Şekil 9 Memcached tutarlı hash örnek diyagramı

Memcached verimli bir dağıtılmış bellek önbelleğidir. Yalnızca memcached'in bellek yönetimi mekanizmasını anlayarak memcached'e daha iyi hakim olabiliriz, böylece verilerimizin özelliklerini ayarlayabilir ve kullanımım için daha iyi hale getirebiliriz. Memcached'in yalnızca temel anahtar / değer çifti veri depolamayı desteklediğini biliyoruz. Memcached bellek yapısında çok önemli iki kavram vardır: slab ve chunk.

Slab bir bellek bloğudur, memcached'in bir seferde bellek için geçerli olduğu en küçük birimdir. Memcached başlatıldığında, kullanılabilir bellek genellikle -m parametresiyle belirtilir, ancak başlangıç anında belleğin tamamı tahsis edilmez. Yalnızca gerektiğinde uygulanacaktır ve her uygulama bir tane olmalıdır döşeme. Döşemenin boyutu 1M (1048576 Byte) olarak sabitlenmiştir ve bir levha eşit boyutta birkaç parçadan oluşur. Her yığın bir öğe yapısını, bir çift anahtar ve değeri kaydeder.

Aynı döşemedeki parçaların boyutu eşit olsa da, farklı döşemelerdeki parçaların boyutu mutlaka aynı değildir.Memcached'de, yığının boyutuna göre döşemeler birçok türe (sınıf) ayrılabilir. Varsayılan olarak memcached Döşemeleri 40 kategoriye ayırın (sınıf1 sınıf40). Sınıf 1'de yığın boyutu 80 bayttır.Bir döşemenin boyutu 1048576 bayta (1M) sabitlendiğinden, sınıf1'de 13107 parçaya kadar olabilir (Diğer bir deyişle, bu levha, 80 bayttan daha az 13107 anahtar-değer verisi depolayabilir).

Memcached bellek yönetimi, ön tahsis ve grup yönetimi yöntemini benimser.Grup yönetimi yukarıda bahsettiğimiz slab sınıfıdır ve slablar yığın boyutuna göre birçok türe ayrılır. Bellek ön tahsis süreci nedir? Memcached'e bir öğe eklerken, memcached önce öğenin boyutuna göre en uygun döşeme sınıfını seçer: örneğin, öğenin boyutu 190 bayttır ve sınıf 4'ün yığın boyutu varsayılan olarak 160 bayttır, bu açıkça uygunsuzdur, sınıf 5 Yığın boyutu, 190 bayttan büyük olan 200 bayttır, bu nedenle öğe 5. sınıfa yerleştirilecektir (burada 10 baytlık bir atık kaçınılmazdır). Yerleştirilecek yığın hesaplandıktan sonra memcached gidecektir. Bu büyüklükte herhangi bir boş parça olup olmadığını kontrol edin, yoksa, 1M (1 levha) alan uygulanacak ve bu türden parçalara bölünecektir. Örneğin, 190 baytlık bir öğeyi memcached'e ilk kez koyduğumuzda, memcached bir levha sınıfı 2 (sayfa da denir) oluşturur ve bir yığın kullanır ve bir dahaki sefere uygun boyutta bir öğe olduğunda 5241 parça bırakır. Tüm 5242 parçalarını kullandığımızda, bir dahaki sefere 160 ile 200 bayt arasında bir öğe eklendiğinde, memcached yeniden bir sınıf 5 levha oluşturacaktır (yani 2 sayfalar).

Özetle, memcached bellek yönetiminde dikkat edilmesi gereken birkaç husus vardır:

  • İri parça sayfaya bölünür ve sayfa 1 m'de sabitlenir, bu nedenle maksimum yığın 1 m'yi geçemez.

  • Yığın tarafından işgal edilen gerçek belleğin 48B artırılması gerekir, çünkü yığın veri yapısının kendisinin 48B'yi işgal etmesi gerekir.

  • Kullanıcı verileri 1 m'den büyükse, memcached verileri birden çok parçaya böler.

  • Tahsis edilen sayfalar geri dönüştürülemez.

Anahtar-değer bilgisi için, boyutu 1 m'yi aşmamak en iyisidir; aynı zamanda, hafızanın maksimum kullanımını sağlamak için bilginin uzunluğunun nispeten dengeli ve istikrarlı olması daha iyidir; aynı zamanda memcached tarafından benimsenen LRU temizleme stratejisi makuldür ve hatta son kullanma süresi artar. İsabet oranı.

Hiçbir özel senaryoda, anahtar-değerin ihtiyaçları karşılayabileceği varsayımı altında, memcached dağıtılmış kümenin kullanılması daha iyi bir seçimdir.İnşa edilmesi ve çalıştırılması nispeten basittir; dağıtılmış bir küme tek bir hata noktası olduğunda, verilerin yalnızca küçük bir kısmı anormaldir. Şu anda, yüksek kullanılabilirliği artırmak için tek noktadan yedekleme yapmak için Magent önbellek proxy modunu da kullanabilirsiniz; önbelleğin tamamı belleğe dayalıdır, bu nedenle yanıt süresi çok hızlıdır ve ek serileştirme ve seriyi kaldırma prosedürleri gerekmez. Bellek ve veriler kalıcı değildir ve küme arızası yeniden başladıktan sonra veriler kurtarılamaz. Memcached'in yüksek sürümü, eşzamanlılık kontrol sorunlarını düşük maliyetle çözebilen CAS modunda atomik işlemleri zaten destekliyor.

...

Tıklamak Orijinali okuyun Tüm içeriği görüntülemek için.

"Game of Thrones" un son sezonuna geri sayım birçok markayı ön ısıtma yapmaya çekti
önceki
Prada Group ayrıca Anakara'da perakende fiyatlarını düşürdü ve ilkbahar ve yaz gişe rekorları kıran oldukça özel | Vanity Daily
Sonraki
2019 park yıllık bileti satışa çıktı! Para biriktirmek için darbeler var, satış noktalarının bir listesi
Yeni Passat'ı deneyimlemek için mağazaya git, bu arabayı satın almamak için bana bir sebep ver
Büyük veri gerçek zamanlı işleme
Sahipler lütfen yer imlerine ekleyin! Arabanın bakımını kendiniz yapın, bu sekiz ipucunun kullanımı çok kolay!
E-ticarette birçok büyük veri pazarlama rutini vardır.Taobao etek satın almak için "insanları görmeli ve yemek yemeli" mi?
UP ana ilem, sıradan otaku, sıradışı iki boyutlu kimlik | Fikir sahibi 100 kişi
Çerçevesiz pencerelerin "zehiri", 300.000 yerden tavana arabanın, Volkswagen CC
İlk yıllarda "The Hunt" dan son yıllarda "The Legend of Demon Cat" e kadar Çin ve Japon filmlerinin karşılıklı öğrenimi ve etkisi nedir?
Ulusal rekabeti kıyaslayın! Profesyonel Beceri Yarışması CNC Torna Montaj ve Bakım Finalleri Yapıldı
"Wufeng Lin Ailesi Tarihi Özel Sergisi" tarihi hatırlıyor ve boğazlar arası entegrasyonu teşvik ediyor
Açılır tavanı olan bir arabaya daha fazla para harcamaya değer mi?
Eylemde reformu derinleştirmek | Merkez eksenin miras uygulamasına yardımcı olan Beijing Jingshan Park, tüm manzarayı ortaya çıkaracak
To Top