Play Cache Api

Merhaba arkadaslar, bu yazımda Play’de kullanabilecegimiz Cache yapısına değinmeye çalışacağım.

Play Cache Api

Cache, temel olarak bir verinin/datanın daha sonra tekrar kullanılması için memory tarzı bir yerde tutulması ve belirli bir süre için taze data, stale olmayan veriyi ifade eder.

Teorik olarak bir data’nın cache tutulması ile orjinali arasında herhangi fark yoktur. Cache’in tek handikapı verinin doğruluğu/tazeliğidir. Bu tip durumlar için de expire zamanı verilebilir, bu sayede cache’den ilgili data için verilen süre de geçerli olacak şekilde taze data bulunması sağlanır.

Play, default bir cache implementasyonu ile gelir. Default impl. EhCache’dir. Yine default olarak build.sbt içerisine ekli olarak gelmektedir, manuel olarak eklemek isterseniz de aşağıdaki gibi ekleyin;

Cache Api’iyi doğrudan controller’da inject ederek ve/veya template engine içerisinde kullanabilirsiniz. play.cache paketi altındaki CacheApi’sini kullanacagız.

Öncelikle action’larımızı routes’da tanımlayalım;

routes.conf

/add action’umuz cache’e veri eklemek icin, /get ise cache’deki veriyi almak için kullanacağız.

Controller’a bakalım;

HomeController.java

/add action’da request param’ları alıyoruz. Burada url : localhost:9000/add?key=name&value=alican&duration=60 ile istek yollarsak “name” key olacak şekilde 60 dk “alican”  verisi cache tutulacaktır.

/get action’da request olarak gelen key’i alıyoruz ve cache’den dönüyoruz. Url :  localhost:9000/get?key=name

Eğer olmayan bir key ile cache’e gidersek bize null dönecektir cache.

Screenshot from 2016-04-13 13:06:57

Cache’e her türlü veri tipini ekleyebiliyoruz, simdi de bir liste ekleyelim. Bunun için bir model class ve service class’ına ihtiyacımız var, tabi action’ları da yazacagız.

Person.java

PersonService.java

Action’larımız;

routes.conf;

/addPersons url’i bize person service üzerinde hardcode birkac person olusturur. Olusturdugumuz listeyi cache’e 15 dk tutması için ekledik.

/getPersons ise bize listeyi json olarak dönecektir;

Screenshot from 2016-04-13 13:05:51

Eğer cache den her durumda cevap almak istiyorak yani cache’de ilgili key ile iliskilendirilmis bir veri yoksa getOrElse kullanabiliriz. Bu method key ile birlikte bir Callable block tanımı isteyecektir bizden. Eğer cache’e olmayan “surname” icin istek yaptıgımızda yine de cevap dönmesini istiyorsak şu şekilde kullanmalıyız;

^^ Yukarıda eger cache’de surname yok ise key : surname ve value : caysever olacak sekilde cache’e bir data ekler. Duration da verilebilir, overloaded methodu bulunmakta.

Not : Cache bir veri eklerken duration verilmezse default olarak 0 atanır, bu da cache’de her zaman tut anlamına gelmektedir.

Named-Cache

Named cache ile farklı cache’lere erilebiliriz. Play default olarak ehcache kullanır demistik, farklı cache tanımları için ehcache.xml’de yapılabilir. Ek olarak application.conf dosyamızda da bu tanımı yapabiliriz. Farklı cache tanımı yapalım, default olarak conf dosyasında bunlar geliyor sadece comment halinden çıkaralım;

Toplam 3 adet cache bind ettik. Bir cache’deki veriye diğer cache üzerinden erişilemez/silinemez. Named cache’e erişelim;

@NamedCache ile cache adını vererek ilgili cache erilşebiliriz. Çok faydalı ve kullanışlı bir özellik olduğunu düşünüyorum. Birbiri ile ilgili olmayan cache datalarını farklı named cache’lerde tutmak daha akılcı olacaktır.

CoffeScript

CoffeScript, javascript yazmayı kolaylaştıran bir araç. Daha sonra bu konuya değinecegim. Şuan cacheden gelen veriyi ekrana basmayı görelim;

index.scala.html;

Proje dizini altında assets/js paketi oluşturalım ve persons.coffee dosyasını olusturalım. CoffeScript, kendini çağırdığınız anda coffescript dosyanızı javascript’e compile eder.

Kullanımı için persons.js olarak çağırmanız yeterli. Ona bakalım;

person.coffee;

Sayfa load oldugunda /getPersons dan person’ları alıp tabloya ekleyecektir. Sonuca bakalım;

Screenshot from 2016-04-13 14:05:51

 

Response Cache

Play, response’ları da cacheleme izin verir. Bunun için yapmamız gereken action üzerinde cached kullanmak. Şöyle ki;

index sayfamızı cached olarak işaretledik. İki zıt durumda sayfa load süresine bakalım;

Cached -> load 162 ms

Screenshot from 2016-04-13 14:18:40

No-Cached -> load 216 ms

Screenshot from 2016-04-13 14:19:10

Load süreleri farklı zamanlarda farklı çıkabiliyor. Net olarak test edebilmek için görece yüklü sayfalarda denemek lazım. Yine de ufak bir hız artışı olduıgunu görebiliyoruz.

Yazıyı burada sonlandırıyorum arkadaslar, sağlıcakla kalın.

Örnek uygulamaya buradan erişebilirsiniz.

~ A.Akkus

 

528 Total Views 1 Views Today