Önbellek, uygulamamızın performansını artırmak için kullandığımız tekniklerden biridir. Örnek vererek konuyu anlaşılır hale getirelim. Örneğin, veri tabanına bir sorgu atıyoruz. Gelen verileri ilk olarak önbelleğe yazıyoruz. Daha sonra kullanıcıya gösteriyoruz. Eğer kullanıcı daha sonra aynı sorguyu çalıştırırsa veri tabanına gitmek yerine verileri önbellekten sunar. Bir diğer verebileceğimiz örnek ise işlem süresi uzun olan algoritmalar. Örneğin, bir algoritmayı param1=4, param2=5, param3=10 parametreleri ile çağırdık. Bir dakika sürdükten sonra 123 sonucunu verdi. Algoritmayı aynı verilerle (param1=4, param2=5, param3=10) tekrar çağırırsak, bir saniyeden daha az bir vakitte bize 123 sonucu verecektir.
İlk olarak Spring Boot’ta önbellek özelliğini aktif hale getirmek için main metodunun bulunduğu sınıfın üstüne @EnableCaching anotasyonu eklenir.
Önbellek işlemlerini yapabilmemiz için bilmemiz gereken bir kaç tane anotasyon bulunmaktadır.
@Cacheable(“cacheName”) → Daha önce ilgili key değerine (cacheName) değer yazılmamışsa önce önbelleğe yazılır. Daha sonra kullanıcıya ilgili değerler döner. Eğer önbellekte ilgili bilgi varsa önbellekten çağrılacaktır. Örneğin, bir metodun üzerinde @Cacheable(“movies”) ifadesi yazılıysa bu metot ilk çağrıldığında veri tabanından gelecektir. İkinci defa çağrıldığında önbellekten gelecektir.
@CacheEvict(“cacheName”) → Önbellekte ilgili key ile yazılmış değer varsa onu silecektir. Örneğin, @Cacheable(“movies”) adında bir metot çağırdık ve önbelleğe film listesini yazdı. Daha sonra @CacheEvict(“movies”) ifadesi olan metodu çalıştırırsak, bellekteki film listesini silecektir.
@CachePut(“cacheName”) → Eğer bir metodun her defasında çalışmasını istiyorsak, bu anotasyonun bulunduğu metodu kullanırız. Bu sayede önbellekte her zaman en güncel veriler olacaktır. Örneğin, @CachePut(“movies”) yazılı metot çalıştırıldığında veri tabanına gider ve veri tabanındaki en güncel bilgiyi önbelleğe yazar. Daha sonra Cacheable(“movies”) anotasyonu bulunan metot çağrılırsa, en güncel bilgiyi verecektir.
Bu kullanımlara ek olarak, farklı kullanım şekilleri de mevcuttur. Direkt olarak örnek üzerinde anlatayım.
@Cacheable(value = “movies”, key = “#movieId”)
Şeklinde de kullanabiliriz. Bu işlem tüm filmleri değil sadece movieId değeri key olarak verilmiş olan filmleri önbelleğe yazar ve oradan getirir.
Eğer uygulamadan önbellek özelliğini kaldırmak istersek, tüm anotasyonları silmek yerine application.properties dosyasına spring.cache.type=none satırı eklenir.
Yukarıdaki kod bloğu ilk çalıştırıldığında 5 saniye sonra film listesi dönecektir ve ilgili liste önbelleğe yazılacaktır. İkinci defa çağıracak olursa liste anında karşımızda olacaktır.
Yukarıdaki kod bloğu çalıştırıldığında, önbellekte “movies” ile saklanmış veriler varsa silinecektir. Örneğin, önce getMovies metodunu çalıştırıyoruz. Bilgiler önbelleğe yazılıyor. Tekrar getMovies metodunu çalıştırırsak önbellekten çok hızlı bir biçimde gelecektir. Bunu yapmak yerine evictMovies metodunu çağırırsak film listesi önbellekten silinecektir. Eğer getMovies metodunu tekrar çağırırsak, sonucun 5 saniyede geldiğini görebiliriz.
Yukarıdaki kod bloğunda tüm yıldızların listesi yerine sadece movieId değerine göre önbelleğe alma işlemi yapılacaktır. Örneğin, /stars/1 şeklinde istek gönderdiğimizde sadece movieId=1 için önbelleğe alınacaktır. /stars/1 isteği tekrar atıldığında sonuç hızlı bir biçimde görüntülenecektir. Fakat /stars/2 şeklinde bir istek gönderildiğinde sonuç için 5 saniye bekleyecektir.
İyi günler,
Bol kodlamalar :)