Spring'in Cache Mekanizmasına Göz Atalım
Merhabalar arkadaşlar. Bu yazıda size Spring’in Cache Mekanizmasını örneklemeye çalışacağım. Hemen örnek uygulamamızın kodları üzerinden anlatmaya başlayalım. Bu yazıdaki uyglamanın kodlarına https://github.com/ilkgunel/SpringCachingExample adresinden erişebilirsiniz arkadaşlar.
Book.java
Yapacağımız örnek uygulamada POJO sınıfı olarak Book sınıfından yaralanacağız. Book sınıfımız kendi içerisinde isbn ve title özellikleri ile onlara ait get-set metotlarını ve ezilmiş toString metodnu barındırıyor.
BookRepository.java
BookRepository interface’imiz içerisinde kitabı Isbn bilgisine ve title bilgisine göre getirecek iki metodumuz yer alıyor.
*SimpleBookRepository.java
SimpleBookRepository sınıfımız BookRepository interface’ini implement ediyor ve getByIsbn ile getByTitle metotlarını Override ediyor. Yapılandırıcı içerisinde isbnBooksMap ve titleBooksMap Map’leri oluşturulup içleri dolduruluyor. isbnBooksMap Map’i key bilgisi olarak isbn’i ve value olarak kitp adını tutarken titleBooksMap Map’i key bilgisi olarak kitap adını, value olarak da isbn bilgisini tutuyor. getByIsbn() metodu erilen isbn bilgisine göre isbnBooksMap’den ilgili kaydı çekip döndürüyor. getByTitle() metodu da titleBooksMap’den ilgili kitap adına ait kaydı çekip döndürüyor.
Burada cache yapısını örnekleyebilmemiz için bir de yavaşlatma servisimiz mevcut. simulateSlowService() metodu getByIsbn() ve getByTitle() metotları çağırıldığında 3 saniye için sistemi uyutuyor ve yapay bir yavaşlık sağlamış oluyoruz.
getByIsbn() ve getByTitle() metotlarının üzerindeki @Cachable notasyonları gördüğünüz gibi kapalı durumda. Bu notasyonları az sonra açacağız ve notasyonu anlatacağım.
AppRunner.java
AppRunner sınıfı bizim Spring Boot uygulamamız ayağa kakltığında çalışır vaziyete geçecek olan bir sınıftır. İçerisindeki run metodu kitap bilgilerini çekip loglayacak ve biz de loglama zamanlarından iki kitap bilgisinin çekilmesi arasındaki süre farkını göreceğiz. Bu süre farkını görmemiz cache’in çalışıp çalışmadığını görmemiz için öenmli.
Application sınıfımız da Spring Boot projemizin ayağa kalkmasını sağlayacak olan sınıftır. Bu sınıfa sağ tıklayıp Run As -> Java Project dediğimiz zaman Spring Boot projemiz ayağa kalkacaktır. Bu sınıfda da @EnableCaching notasyonunun kapalı olduğuna dikkat edelim.
Application.java
Caching Devre Dışı İken Konsol Çıktısı
Spring Boot Uygulamasını ayağa kaldırdığımda konsol çıktısı şöyle olmakta:
Konsol çıktısında dikkat eder isek her bir kitabın kaydının çekilip loglanması arasında 3 saniye mevcut. Örneğin isbn-1 kitabı 16:00:32 zamanında loglanırken isbn-2 kitabı da 16:00:35 zamanında loglanıyor. Yani 3 saniye sonra.
Şimdi cache mekanizmasını devreye alıp testimizi yapalım. İlk olarak Application sınıfındaki @EnableCaching notasyonunu açalım. Bu notasyon Spring’in cache mekanizmasına izin verecek olan notasyondur.
Akabinde SimpleBookRepository getByIsbn() ve getByTitle() metotlarının üzerindeki @Cacheable notasyonlarını açalım. getByIsbn() metodunun üzerindeki @Cacheable notasyonu books ismi ile cache işlemi yapıyor. getByIsbn() metodu her çağırıldığında cache mekanizması gelen isbn bilgisi ile ilgili cache olup olmadığında bakıyor ve eğer cache varsa onu döndürüyor. Eğer yoksa ise metodun sonucunu cache’leyip döndürüyor.
getByTitle() metodunun üzerindeki @Cacheable notasyonu ise cache işlemi yaparken bir şarta sahip. condition özelliği ile verilen bu şartta kitabın isim bilgisi 6 haneden küçük cache işlemi yapılamayacak.
Caching Devrede İken Konsol Çıktısı
Cache ile ilgili notasyonları açıp çalıştırdığımda ise durum şöyle olmakta:
Fetching books According To Isbn ile başlayan loglama satılarına baktığımızda ilk 3 satırın yine 3 saniye aralıklara geldiğini görüyoruz çünkü cache başta boş ve gelen kitaplar metot çalıştıktan sonra cache’lenecek. Fakat takip eden 3 satıra baktığımızda ise kitap kayıtlarının cache’den çekilip hemen yazdırıldığını görüyoruz. İkinci isbn-1,isbn-2,isbn-3 loglarına dikkat edersek aralarında hiç zaman farkı olmadan log’a yazıldılar.
Diğer taraftan kitap ismine göre kayıt çeken metot için yapılan log’lamaya baktığımızda ise yine ilk 3 kitabın 3 saniye aralıklarla yazdırıldığını görüyoruz. Fakat burada bir şey dikkatimizi çekiyor, Kuyucaklı Yusuf kitabından sonra 1984 kitabının yazdırılması 3 saniye sonra oluyor. 1984 kitabından sonra da Hayvan Çiftliği ve Kuyucaklı Yusuf kitabı aynı saniye içinde loglanıyorlar. Bu da getByTitle() metoduna verdiğimiz kitap ismi 6 karakterden az olanları cache yapısına almama komutunun çalıştığını doğruluyor.