Spring Boot + Redis

Spring Boot & Redis

Spring Boot ve Redis’ in birlikte kullanımını örneklendirmek için basit bir uygulama hazırlayalım. Uygulamaya başlamadan önce Spring Boot projeleri hazırlamak yazıma göz atabilirsiniz.

Redis

Key-value şeklinde hazırlanmış bir NoSql veritabanıdır. Birçok veri yapısını destekler (string, hash, list, set vs.) ve veriyi bellekte tutar. Ayrıca veriyi diske yazabilme opsiyonu da var.

Redis resmi olarak Windows’u desteklemiyor fakat Microsoft Open Tech ekibi Win64 uyumlu hâlini sunmakta.

Windows bilgisayarınıza Redis’ i kurmak için buradaki linkten güncel versiyonu indirip yükleyebilirsiniz. Kurulum sonrasında Redis servis olarak bilgisayarınıza yüklenecektir (Hizmetler-Services kısmından görebilirsiniz).

Redis üzerindeki anlık key-value değerlerini Redis Desktop Manager ile yönetebilirsiniz. Gayet basit ve kullanışlı bir arayüzü var.

Spring Cache

Anotasyonlar üzerinden veriyi istediğiniz cache kütüphanesi üzerinde yönetebilmenizi sağlayan bir interface.

EnableCaching
Cache anotasyonlarının aktif olmasını sağlar. Herhangi bir configuration sınıfınıza tanımlayabilirsiniz.

Cacheable
Tanımlı olduğu methodun sonucu ilgili cache kütüphanesine kaydedilir. Method aynı değerlerle çağrılırsa çalıştırılmadan sonuç cache’ ten okunur. Method parametreleri key olarak kullanılır. İsterse bu davranış değiştirilebilir.

CachePut
Cacheable anotasyonunda olduğu gibi method sonucunu cache’ e kaydeder fakat sonraki method çağırımlarında yine method çalışır.

CacheEvict
Key değeri ile veriyi cache’ ten siler.

Caching
Birden fazla cache anotasyonlarını gruplayarak tanımlayabilmenizi sağlar.

Proje yapısı

project files

pom.xml e Dependency Ekleme

Bir önceki yazımda oluşturduğumuz projeyi kullanalım. Maven pom.xml dosyasında Spring Boot Starter Data Redis i dependency lerimize ekleyelim.

...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
....

Cache İsimleri ve Expire Süreleri Tanımlama

CacheProperties sınıfı, application.properties dosyamıza eklediğimiz cache ismi ve expire sürelerini map eder.

...
# Cache expirations (sec)
cache.expirations.movie = 7200
cache.expirations.movies = 7200

Redis Configuration (CacheManager ve KeyGenerator)

RedisConfiguration.java

RedisConfiguration sınıfı ile Spring Cache in key-value yönetimini Redis üzerinde yapabilmesi için istediğimiz ayarları yapıyoruz. Sınıfımız bir configuration class ı olduğu ve cache leme anotasyonlarını kullanabilmemiz için Configuration ve EnableConfig anotasyonlarını tanımladık.

Cache mekanizması için default key generator ı tanımladık. Buradaki yaklaşım class ismi, execute edilen method ve parametreler aralarında # işareti ile birleştirilecek şekilde key oluşturulması sağlanır. Örneğin; MovieService#findOne#1.

CacheManager bean sınıfı ile application.properties dosyamıza eklediğimiz cache isim-expire süresi map ini tanımladık. Cache kütüphanemiz Redis olduğu için RedisCacheManager sınıfını kullandık.

StringRedisTemplate ile Redis e veriyi json olarak kaydedecek, okurken de json to object yapacak şekilde template bean sınıfını tanımladık.

localhost:8080

Projemizi çalıştırdığımız zaman aşağıdaki ekranlarla karşılaşacağız.

home page
new one
edit one

Sayfayı ilk yüklerken biraz zaman alacak, sonraki istekler de oldukça hızlı gelecektir, farkı sayfa altında yer alan render hızı ile görebilirsiniz.

Not; cache mekanizması kullanmasak da MySql in query cache özelliğinden dolayı normal şekilde de ilk sorgudan sonrakiler hızlı gelecektir. Cache in faydasını daha net görebilmek adına servis methoduna Thread.sleep komutu eklenebilir.

Cache Anotasyonlarının Kullanılması (Cacheable, CachePut, CacheEvict)

Burada servisin findAll methodu ilk defa çalıştırıldığında dönen sonuç değeri, movies cache ismi ve tanımladığımız default key generator ile oluşturulan key (MovieService#findAll) ile Redis’ e kaydedilir.

Aynı şekilde findOne methodu ilk çalıştırıldığında sonuç değeri, movie cache ismi ve tanımladığımız key (movie#id) ile Redis’ e kaydedilir.

Yeni bir kayıt oluşturmak veya update etmek istediğimizde movies isimli cache silinir ve movie#id isimli key güncellenir.

Not; cache anotasyonlarında key ve keyGenerator beraber tanımlanamaz. Aksi durumda hata alınır.

redis desktop manager

Proje Kodları