Hic Microsoft in-memory cache kullanmadim, sorularim var.
1) Invocation.success ise pattern'e gore cache'den key remove ediyorsunuz. Ilk request cache'den, ikincisi key remove edildigi icin source'dan geliyor olabilir mi?
2) Cache gercekten singleton mu? Birinci instance'da var digerinde yok ve source'dan aliyor olabilir mi? Suradaki gibi kurguluyorsunuz degil mi -> builder.Services.AddSingleton<MyMemoryCache>();
Cache in-memory in ASP.NET Core
3) Istekleri admin olmayan kullanici ile atiyorsunuz degil mi? Admin bypass ediyor.
4) Neden update sonrasi tum key'leri siliyorsunuz? Sadece update edileni silmeniz gerekmez mi?
Soyle basit bir senaryo ile test edince ne sonuc aliyorsunuz? ( Kod zimbirtisi calismiyor, bodos yaziyorum )
value = if ( cache.contains(key) ) cache.retrieve(key) else source.retrieve(key)
cache.set(key,value,15min)
// LRU, her defasinda set ediyor
// remove aspect yok
// admin check yok
// tercihen cache hit ve miss senaryolarini loglayarak takip edin
Ben sorunun key remove etme seklinizde oldugunu dusunuyorum.
Cache cok hizli oldugu icin contains ve retrieve ayni anda kullanmak OK'dir diye dusunuyorum. Aslinda cache.retrieve(key, defaultVal) seklinde kullanmak daha dogru.
Cache thread-safe'dir diye dusunuyorum ama siz race-condition introduce etmis olabilirsiniz.
Log yazarak remove ve set arasindaki siralamayi karsilastirabilirsiniz.
Normalde Cache'e evictionPolicy ve fallBackPolicy belirledikten sonra aslinda data yonetimini ona birakmaniz gerekiyor. Siz update sirasinda cache guncellemiyorsunuz ( key siliyorsunuz ), data cektikten sonra set ediyorsunuz.
Normal kullanim su sekilde olmali:
Cache cache = CacheBuilder.eviction ( 15min ). source( dataSource );
function getById(id){
return cache.retrieve(id) // yoksa dataSource'dan alir ve set eder.
}
function store(object){
key = dataSource.save(object)
cache.set(object).
}