SpringData ve Redis

Bir önceki yazıda Redis’in ne olduÄŸuna, kısaca geliÅŸtirme ortamınız için nasıl Redis kurulumu yapabileceÄŸinize deÄŸinmiÅŸtik. Bu yazıda ise bir seviye daha ileriye gidip spring-data kullanarak, Redis ile nasıl haberleÅŸebileceÄŸimize bakalım.

redis

Projemiz basit bir “Hello, World” tipi bir uygulama olucak. Yani kısaca String tipindeki key-value ikililerinin nasıl Redis üzerinde tutulacağına bakacağız. Basitçe Redis’in nasıl kullanıldığını anladıktan sonra, cache’lemek için Redis’i nasıl kullanacağımıza deÄŸineceÄŸiz. Projeyi geliÅŸtirirken spring-boot ve spring-Data kütüphanelerini kullanacağız. Ben geliÅŸtirme ortamı olarak Intellij 14 kullanıyorum. Temel sebebi spring-boot projelerini çok rahatlıkla oluÅŸturabilmenizdir. Fakat isterseniz https://start.spring.io adresinden de aynı ÅŸekilde bir porje oluÅŸturabilir ve bunu favori geliÅŸtirme ortamınıza ekleyebilirsiniz. Build aracı olarak her zamanki gibi maven kullanacağım. Spring boot bizim için herÅŸeyi hallettiÄŸinden, pom.xml ile ya da baÅŸka herhangibir xml dosyası ile uÄŸraÅŸmayacağız. Ondan gradle kullanmamanız için de bir sebep yok.

Projenin Yaratılması

Projemizin ne olduğuna kısaca değindiğimize göre şimdi projemizi nasıl yaratılacağına değinebiliriz. Dediğim gibi ben intellij kullanarak anlatacağım ama start.spring.io üzerinden de aynı işlemleri gerçekleyebilirsiniz.

Öncelikle yeni bir proje yaratıyoruz. Proje tipi olarak Spring Initializr seçiyoruz.

 

spring-initDaha sonra gelen ekranda hangi kütüphaneleri kullanacağımızı seçiyoruz. Biz sadece spring-data ve Redis kullanacağımız için, sadece Redis’i seçiyoruz.

project-info

 

Daha sonra gelen ekranda proje bilgilerini dolduruyoruz. Ben aşağıdaki şekilde doldurdum.

spring-redis

Böylelikle projemizi yaratmış oluyoruz.

“Hello, World”

Åžimdi hızlıca “Hello, World” uygulamasını nasıl yapacağımıza bakalım. SpringBoot saÄŸolsun bizim için herÅŸeyi ayarladığından bizim yapacağımız çok fazla bir ÅŸey kalmıyor. Åžimdi SpringRedisApplication.java sınıfını aÅŸağıdaki gibi güncelleyelim.

SpringRedisApplication.java

Uygulamamızı bir önceki yazımızda hazırladığımız Vagrant dosyasını kullanarak çalıştıracağız. Vagrant ile yeni bir sanal makine oluÅŸturmuÅŸ oluyoruz. Ve kendi makinemizle bu sanal makine bir aÄŸda çalışıyor oluyorlar. Biz Vagrant’ın oluÅŸturduÄŸu sanal makineye Vagrantfile içerisinde verdiÄŸimiz adresten yani 192.168.33.10’ten ulaşıyoruz. Aynı ÅŸekilde yeni yazdığımız uygulamamıza da Redis sunucusuna hangi adresten ulaÅŸabileceÄŸini söylememiz gerekiyor. Bunun için application.properties dosyasına aÅŸağıdaki satırları eklememiz yeterli olacaktır.

application.properties

Åžimdi SpringRedisApplication uygulamamızı çalıştıralım ve mesajımızın düzgün ÅŸekilde iletilip alındığını görmüş olalım. Peki sadece String tipinde mi mesajlar gönderebiliyoruz? Tabiki de hayır. RedisSerializer tipinde bir interface bulunuyor. Bunu implement ederek istediÄŸiniz her türde veriyi gönderip almanız mümkün. Ama unutmayın uygulamanızı ayarlarken key için hangi RedisSerializer’ı, ilgili deÄŸer için hangi RedisSerializer’ı kullanacağınızı belirtmeniz gerekiyor.

Redis Cache

Temel kısmı hızlıca halletiÄŸimize göre asıl eÄŸlenceli kısma gelebiliriz. Spring-Cache’i daha önce kullandıysanız ne kadar güzel bir kütüphane olduÄŸu konusunda az buçuk fikriniz vardır. Daha önce kullanmamış olanlar için kısaca ne olduÄŸundan bahsedeyim.

Spring Cache

Spring Cache annotasyonlar üzerinden bilgileri cache’lemenize olanak saÄŸlayan bir mekanizma. Spring’in bir parçası. Tek kısıtı, annotasyonlarınızı kullandığınız Bean’lerin Spring tarafından yönetilmesi gerekiyor. En güzel yanı ise alt tarafta istediÄŸiniz cache kütüphanesini(Ehcache, Memcache, Guava, Redis vs.) kullanabilirsiniz. İleride bununla ilgili daha detaylı bir yazı yazmayı düşünüyorum zaten.

Her ne kadar biz örneğimizde tek tip annotasyonunu kullanacak olsakta, kısaca tüm annotasyonlarının üzerinden geçeyim.

Annotasyonİşlevi
@Cacheableİlgili metodun sonucu ayarlanan cache kütüphanesine kaydedilir. EÄŸer yeni bir talep gelirse ve aynı ‘key’ deÄŸeri kullanıldıysa yeni sonuç doÄŸruca cacheten okunur. Default olarak metodun parametreleri ‘key’ olarak kullanılmaya çalışılır. Tabi burada parametrelerin alt taraftaki cache kütüphanesi tarafından desteklenen veri tiplerinden olması gerekiyor.
@CachePut@Cacheable’da olduÄŸu gibi metod sonucunu ilgili cache kütüphanesine kaydeder. Fakat bir sonraki çağırımda yine method çalışır.
@CacheEvictBir verinin cache’lenmesinde en önemli konu, cache’teki verinin güncelliÄŸinin korunmasıdır. Bu annotasyon cache’inizin gerektiÄŸinde güncellenmesine olanak saÄŸlar. İlgili metod çağırıldığında ‘key’ deÄŸerindeki veri cache’ten silinir.
@EnableCachingBu daha çok ayarlarla ilgili. Ayarlarınızı java sınıfı üzerinden yapıyorsanız, ilgili ayar sınıfınızın tepesine bu annotasyonu koyduÄŸunuzda cache’iniz aktif hale gelir. Fakat sadece aktif etmeniz yetmez bit CacheManager tipinde Bean yaratmanız ve hangi Cache kütüphanesinin yaratılacağını belirtmeniz gerekir.

Cache’lenek Servis Katmanı

Şimdi, çok zaman tüketen, bir hayli işlem yapan bir servis katmanı yazalım. Daha sonra annotasyonlarımızı ekleyeylim. Öncelikle src/main/java altında, com.bahadirakin.redis paketine SomeLongBusiness.java isminde bir interface yaratalım. Tahmin edebileceğiniz gibi bu interface bizim zaman alan servis katmanımızı oluşturacak.

SomeLongBusiness.java

Şimdi de bu sınıfımızın implementasyonunu aynı paket içerisine yaratalım.

SomeLongBuinessImpl.java

Gördüğünüz gibi işlemimiz bir hayli zaman alacak şekilde tasarlanmış. Yaklaşık 5sn sürecek bu işlem. Anlaşılmayan bir konu olduğunu düşünmüyorum. Şimdi bunu çağıracak sınıfımıza bakalım. SpringRedisApplication.java dosyasını aşağıdaki gibi düzenleyelim.

Son

Böylelikle hem mesajlaÅŸma hem de cahce’leme yapan uygulamamızı geliÅŸtirmiÅŸ olduk. Öncelikle “vagrant up” ile sanal makinemizi ayaÄŸa kaldırıp uygulamamızı çalıştırıyoruz. İlk çalıştırmamızda aÅŸağıdakine benzer çıktılar almamız gerekiyor.

İkinciye çalıştırdığımız da ise hiç bir bekleme yapmayacaktır ve bu sefer aşağıdakine benzer çıktılar alacağız.

Redis kullandığımızdan cache’lediÄŸimiz veriler farklı çalıştırmalarda da saklanmış oluyor. Bu aslında bakarsanız, clustered ortamlarda çok iÅŸinize yarayacak bir durum. Böylelikle aynı iÅŸlem farklı makinelerde de olsa tekrar tekrar yapılmamış oluyor.octobiwan

Projenin tamanına ise aşağıdaki adresten ulaşabilirsiniz.

End of Line