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