RedisCacheExample · Redis ile önbellekleme

Cache-aside okuma, beş dakikalık TTL, JSON serileştirme ve manuel geçersizleştirmeyi StackExchange.Redis ile gösteren .NET 8 ürün API örneği.

Bir ürün kataloğuna art arda gelen isteklerin çoğu aynı listeyi ister. RedisCacheExample, bu tekrarın API tarafında nasıl ele alınabileceğini küçük bir ASP.NET Core 8 uygulaması üzerinden gösteriyor. Katalogda dizüstü bilgisayar, fare ve klavyeden oluşan sabit bir örnek veri kümesi var. Burada ürün sayısından daha önemli olan ayrıntı, API’nin aynı listeyi farklı isteklerde hangi kaynaktan aldığını yanıtın içinden takip edebilmek.

İlk istek listeyi Redis’e nasıl taşır?

GET /api/Product/get-data çağrısı önce Redis’teki products anahtarını okur. Anahtar boşsa ProductController, FakeDataContext içindeki ürünleri alır ve listeyi beş dakikalık süreyle Redis’e yazar. Yanıtta Data ile birlikte Source = Database değeri gelir. Bu etiket, önbellek dışındaki okuma yolunu temsil eder. Projede bu yol, Id, Name ve Price alanlarına sahip nesneleri döndüren bellek içi bir listeye bağlanır.

Aynı uç noktayı bu süre içinde tekrar çağırdığımızda Redis’teki JSON, List<Product> türüne dönüştürülür ve bu kez yanıt kaynağı Cache olur. Uygulamanın ana veri kaynağına yalnızca önbellekte karşılık bulunamadığında başvurduğu bu akışa cache-aside denir. Beş dakikalık süre yazma anında başlar. Sonraki okumalar süreyi uzatmadığı için ilk ve ikinci çağrı arasındaki farkı, ardından süresi dolan anahtarın yeniden oluşmasını aynı uç noktada izlemek mümkün.

Süre dolmadan önbelleği temizlemek

Bu örnekte tek anahtar tüm ürün listesini temsil eder. Dolayısıyla tek ürünün fiyatı değişse bile listeyi temsil eden anahtarın temizlenmesi gerekir. Önbellek birimi ürün başına kayıt olsaydı, anahtar seçimi ve temizleme işlemi de ürün kimliği üzerinden tasarlanırdı.

Fiyatların bir yönetim ekranından güncellendiği bir katalog düşünelim. Liste, kaynağında değiştikten sonra Redis’teki eski kopyanın süresinin dolmasını beklemek bir süre daha eski fiyatların gösterilmesine yol açabilir. Örnekte bir fiyat güncelleme akışı bulunmuyor. Bunun yerine DELETE /api/Product/clear-cache çağrısıyla products anahtarı elle silinebiliyor. Ardından gelen ilk okuma listeyi yeniden kaynaktan alıyor. Önce listeyi iki kez okumak, sonra anahtarı silip tekrar okumak, kaynak değişimini ürün verisini değiştirmeden gözlemlemek için yeterli.

Redis işlemlerini denetleyiciden ayırmak

Denetleyici hangi anahtarın kullanılacağına ve listeye ne zaman başvurulacağına karar verir. RedisCacheService ise StackExchange.Redis ile anahtarı okur, değeri yazar veya siler. Yazarken System.Text.Json ile ürün nesnelerini bir JSON metnine çevirir ve StringSetAsync çağrısına geçerlilik süresini ekler. Okuma tarafında tür parametresi, aynı servis metodunun hedef .NET türüne göre dönüştürme yapmasını sağlar.

Başlangıçta Redis servisi tek örnek olarak kaydedilir ve yerel localhost:6379 adresine bağlanır. Projenin README dosyasında Redis’i Docker ile başlatmak için bir komut yer alır. Geliştirme ortamında Swagger üzerinden okuma ve temizleme uç noktaları denenebilir. Aynı uç noktayı önbellek boşken, doluyken ve silindikten sonra çağırıp her yanıttaki kaynak etiketini karşılaştırabilirsiniz.