Redis önbelleğinin kullanımı, özellikle veri sorgulamasında uygulamaların performansını ve verimliliğini büyük ölçüde artırır. Ama aynı zamanda bazı sorunlar da getiriyor. Bunlar arasında en önemli sorun, kesinlikle çözülemeyen veri tutarlılığıdır. Veri tutarlılığı gerekiyorsa, önbellek kullanmak mümkün değil.
Diğer tipik sorunlar ise önbellek penetrasyonu, önbellek çığı ve önbellek bozgunudur. Şu anda sektörde daha popüler çözümler de bulunmaktadır. Bu makale, bu üç sorunu daha mükemmel çözmek için değil, sektördeki popüler çözümleri altüst etmek için de değil. Bunun yerine, bu üç problem olgusunu gerçek kod işleminden göstereceğiz. Bunu yapmanın nedeni, bu problemlerin akademik açıklamasına bakarak kafada çok canlı bir kavram oluşturmanın zor olmasıdır ve gerçek kod gösterimleriyle bu problemleri daha derinleştirebilirsiniz.
Önbellek nüfuzu
Önbelleğe girme, veritabanında olmayan verilerin sorgulanmasını ifade eder. Anahtar mevcut yoksa veya anahtarın süresi dolduğunda, veritabanı sorgulanır ve sorgulanan nesneler önbelleğe alınır. Veritabanı sorgu nesnesi boşsa, önbelleğe alınmaz.
Kod akışı
- parametre geçerken nesnenin birincil anahtar kimliğini
- Anahtara göre nesneyi önbellekten alın
- Nesne boş değilse, doğrudan geri döner
- Nesne boşsa, veritabanı sorgusu yapın
- Veritabanından sorgulanan nesne boş değilse, önbelleğe alın (son kullanma süresini ayarlayın). Böyle bir durumu düşünün, eğer verilen parametre -1 olursa ne olurdu? Bu -1, var olmaması gereken bir nesnedir. Veritabanı her seferinde sorgulanır, her sorgu boş olur ve her zaman önbelleklenmez. Kötü niyetli bir saldırı olursa, bu güvenlik açıklığı veritabanına baskı yapmak veya hatta onu bunaltmak için istismar edilebilir. UUID kullanılsa bile, var olmayan bir ANAHTAR bulup saldırmak kolaydır.
Çalışmamda, null değerleri önbellekleme yöntemini kullanacağım, yani [kod sürecinde] 5. adım; veritabanından sorgulanan nesne boşsa, o da önbelleğe alınır, ancak önbellek süresi kısa olur, örneğin 60 saniyeye ayarla.
Depo çığı
Cache çığı, önbellek setinin belirli bir zaman diliminde süresi dolmasını ifade eder.
Örneğin, bu makaleyi yazarken çığ olayının nedenlerinden biri, yakında on ikinci gün saat sıfırda olacak ve yakında bir acele alışveriş dalgası başlayacak. Sonra sabah saat birde, bu ürün partisinin deposu sona erecek. Bu ürün partisi için erişim sorgusu veritabanına düşer ve veritabanı için periyodik basınç zirveleri olur.
Xiaobian e-ticaret projeleri yaptığında genellikle farklı ürün kategorilerini benimser ve farklı döngüleri önbelleer. Aynı kategorideki mallar ve rastgele bir faktör. Bu şekilde, önbellek son kullanma süresi mümkün olduğunca dağıtılabilir, popüler kategorilerdeki ürünlerin önbellek süresi daha uzun olur ve popüler olmayan kategorilerdeki ürünlerin önbellek süresi daha kısa olur; bu da önbellek servisinin kaynaklarını da tasarruf edebilir.
Aslında, merkezi son kullanma çok ölümcül değildir ve önbellek çığının daha ölümcül olması, önbellek sunucusunun bir düğümünün çökmesi veya bağlantısının kesilmesidir. Doğal olarak meydana gelen önbellek çığının belirli bir zaman diliminde oluşturulması gerektiği için, veritabanı basınca dayanabilir ve bu dönemde veritabanı da basınca dayanabilir. Bu, veritabanı üzerinde periyodik baskıdan başka bir şey değil. Önbellek servis düğümünün durma süresi, veritabanı sunucusu üzerinde öngörülemez bir baskı yaratır ve veritabanını anında bunaltma olasılığı yüksektir.
Önbellek dağılımı
Önbellek bozumu, çok sıcak olan, sürekli büyük eşzamanlılık taşıyan bir anahtarı ifade eder; büyük eşzamanlılık bu noktaya erişmeye odaklanır; bu anahtar başarısız olduğunda, sürekli büyük eşzamanlılık önbelleği kırar ve doğrudan veritabanını talep eder; tıpkı bir bariyerde delik açmak gibi.
Xiaobian e-ticaret projeleri yaparken bu ürünü "hit" yaptı.
Aslında, çoğu durumda, bu tür patlamaların veritabanı sunucusuna ezici baskı kurması zordur. Bu seviyeye ulaşmış çok az şirket vardır. Bu nedenle, pragmatik editör ana ürünlere erken hazırlanmış ki önbellek asla süresi dolmaz. Bazı ürünler kendiliğinden ürün haline gelse bile, asla süresi dolmayacak olarak ayarlanabilir.
Ana yol basit ve mutex anahtarlı karşılıklı reddetme kilidi pek kullanılmıyor.
|