Skip to main content

IHybridRequestCache

Uygulama katmanının cache arayüzü. HybridCache’i doğrudan inject etmek yerine bu interface kullanılır — multi-instance broadcast hook’u ve domain-friendly imza için. Tanım: src/BuildingBlocks/BuildingBlocks.Caching/IHybridRequestCache.cs.
RemoveByTagAsync vs RemoveByTagLocallyAsync farkı için: Invalidation ve Multi-Instance.

Stampede koruması

HybridCache.GetOrCreateAsync aynı key için paralel gelen istekleri tek factory çağrısında birleştirir: cache miss anında ilk istek factory’yi (DB sorgusu) çalıştırır, diğerleri sonucu bekler. Bu sayede cold cache + yüksek trafik durumunda DB’ye yüzlerce eşzamanlı sorgu gitmez. Davranış HybridCache infrastructure’ından gelir; ek kod gerektirmez.

Kayıt sırası KRİTİK

HybridCache, L2 backend’ini (IDistributedCache, Redis) kayıt anında keşfeder. Bu yüzden Redis önce register edilmiş olmalı:
Sıra bozulursa (AddHybridCache önce, AddRedisCache sonra) HybridCache IDistributedCache’i göremez ve L1-only mode’a düşer — Redis hiçbir zaman dolmaz, multi-instance’da her node ayrı veri tutar. AddCache metodu (BuildingBlocks.Caching/DependencyInjection.cs) bilerek HybridCache register etmez; bu sorumluluk Program.cs’e bırakılır çünkü L2 backend önce hazır olmalı.
AddCache ne register eder:

Spec tabanlı cache — CachedRepository<T>

CachedRepository<T> (src/.../Infrastructure.EFCore/Repositories/CachedRepository.cs), IReadRepository<T> üzerinde bir HybridCache decorator’üdür. Read path’i spec cache açıksa otomatik cache’ler:
Spec’te cache’i şu fluent zincirle açarsın (Ardalis EnableCache + projeye özel WithCacheTtl/WithTags):
WithCacheTtl adı bilinçli seçilmiştir — Ardalis’in WithTimeToLive’i ile ambiguous reference olmasın diye. TTL/tag bilgisi spec instance’ına ConditionalWeakTable üzerinden attach edilir (SpecificationExtensions); spec GC olunca metadata da serbest kalır.
EnableCache(name, args...) zinciri spec’in CacheKey + CacheEnabled property’lerini set eder (Ardalis 9.x). args cache key’in parçası olur — yani her sayfa/arama varyantı ayrı entry, ama hepsi aynı faqs tag’i altında.

Cache ne zaman devre dışı?

CachedRepository.CacheDisabled(spec) üç koşuldan biri sağlanırsa raw EF Core’a düşer:
Ayrıca AnyAsync ve spec’siz çağrılar (ListAsync(), GetByIdAsync(...)) bilerek passthrough’tur — cache istiyorsan CompositeSpecification + EnableCache kullan.

İlgili

Invalidation

Tag düşürme: domain event handler’da RemoveByTagAsync.

Multi-Instance Senkron

RemoveByTagLocallyAsync + echo guard.

Specification

Ardalis.Specification ve cache zinciri.

Cache Mimarisi

Genel bakış ve konfigürasyon.