18 Ocak 2023 Çarşamba

Cache Stratejileri - Cache Access Patterns Cache-aside

Giriş
Okuma ve yazma işlemlerini kendimiz kodla yapıyoruz

1. Okuma
Okuma şeklen şöyle
Açıklaması şöyle. Aslında bu işlemi cache alt yapısına yaptırırsak Read-Through elde ederiz.
1. Whenever a requests comes to the application, it firsts checks the requested data in the cache.
2. If yes, the cache returns the data.
3. Otherwise, the application queries the data from the database, updates the cache on the way back and then returns the data.
Kod olarak şöyle
String cacheKey = "hello world";
String cacheValue = redisCache.get(cacheKey);
// got cache
if (cacheValue != null) {
    return cacheValue;
} else {
    //no cache, read from database
    cacheValue = getDataFromDB();
    // write date to cache
    redisCache.put(cacheValue);
}
2. Yazma
Yazma ise şöyle. Burada bir çok seçenek var. Önce veri tabanı güncellenebilir, veya cache güncellenebilir, cache silinebilir. Bunlar şöyle
1. Update the cache first, then update the database.
2. Update the database first, then update the cache.
3. Delete the cache first, then update the database.
4 Update the database first, then delete the cache.
Hangisi kullanılırsa kullanılsın, iki tane işlem olduğu için birisinin başarısız olma veya tutarsız sonuç dönme ihtimali var. Bu yüzden cache nesnelerine genellikle zaman aşımı ve bayatlama süresi konuluyor. Böylece bir müddet sonra eventual consistency elde ediliyor. 

Çözümler ve Etkileri
1. Update the database first, then delete the cache
Açıklaması şöyle
After updating the database, the corresponding records of the cache should be cleared immediately. When the same request comes in next time, it will be taken from the database first and the latest result will be written back to the cache.
Problemler
1. Eventual Consistency
Şeklen şöyle. Burada A işlemi bitirinceye kadar B halen eski veriyi okuyor


2. Uygulama veri tabanını günceller ancak cache güncellemesi yapmadan önce ölür. 
Açıklaması şöyle
..  when A wants to update the data, A is killed after finishing the database update, probably due to bugs or application upgrade and so on. Then the data in the cache will remain inconsistent for a long time, until the next update or timeout.
3. Lost Update
Şeklen şöyle
Bu aslında Lost Update problemi ile aynı. A eski veriyi okuyor ve ve Cache'e bunu yazıyor

4. Double Delete
Tutarlılığı artıran bir çözüm de şöyle. Buna double delete deniliyor
Delete the cache first.
Write database.
Sleep for 500 milliseconds, then delete the cache.


Hiç yorum yok:

Yorum Gönder