Springのキャッシュ機構/No-SQLのredisを格納先として使う。STS3+SpringBoot
Springのキャッシュ機構で、外部格納先として、redisを利用してやってみます。
なお、STS3(3.9.6)+SpringBoot2.0+tymeleaf3.0迄動作確認しています。
No-SQLのredis
redisとは、NO-SQLのインメモリDBのひとつです。
KVS(Key-Value Store=キー・バリュー型データベース)なのですが、ハッシュなどの型も使えたり、オプションで永続性を持たせることができるなどの特徴があります。
インメモリDBはとても高速です。
キャッシュ機構に使うには、とても適しています。
まずはredisをインストールします。
Windows10の環境にインストールします。
残念ながら、redisは正式にはWindowsをサポートしていません。
なんですが。
最近はマイクロソフトが、MsOpenTechという取り組みで、オープンソースプロジェクトのプロダクトのWindowsバイナリを提供してくれています。
redisもありました。・・ありがたいですね。
こんな感じで複数のバージョンが表示されます。
2017/08時点の最新版、3.0.504を選んでみます。
Redis-x64-3.0.504.msiをダウンロードしてインストールします。
追記:2019/02/23時点は3.2.100になってました・・。
普通にWindowsインストーラが起動するので、Nextを押してデフォルトのまま進めば、OKです。
気をつけるのは次の2点です。
- 途中で動作するポートを指定する画面がでてきます。デフォルトの6379のままにしておくことをおすすめします。
- 利用するメモリの上限を設定する画面がでてきます。デフォルトだと無制限ですが、キャッシュで利用するだけであれば、limitにチェックをつけて、100MBから200MB程度までの利用にしておくほうがいいです。特に、Windows環境で無制限にすると、時々起動しないトラブルがあるみたいです。
確認はサービスで、redisが動いていればOKです。
redisをプロジェクトに組み込む
さて、redisのインストールができたら、今度はプロジェクトに組み込みます。
pom.xml
まず、pom.xmlに以下の依存関係を追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
CachingConfigクラス
そして、前回、作ったCachingConfigクラスを変更します。
@Configuration
@EnableCaching
public class CachingConfig {
}
上記のように、空のクラスにしてください。
この変更だけで、前回作成したキャッシュ操作のクラスはそのまま動きます。
ソースコードはこちらで確認してください。
AutoConfigureの対象になっているみたいです。
だから、@EnableCachingを定義て空クラスを作るだけで、自動的にredisをキャッシュ機構で使えるようになっているみたいです。
application.properties
設定は、application.propertiesで行えます。
以下がデフォルトなので、ローカル環境でユニットテストで利用するだけなら、何も設定しなくてもいい仕掛けです。
spring.redis.host= localhost
spring.redis.port= 6379
spring.redis.password=null
実行して時間計測してみた
うーん。
予想外の結果が。
自分の環境(Windows10)では、前回のConcurrentMapCacheManager版と比較して、キャッシュが遅いです。
まったく同じデータで実行して、比較してみました。
ConcurrentMapCacheManager版:0.002秒 に対して、redisCacheManager版:0.055秒 でした。
ただ、これは自分の環境で・・そうだったというだけです。
まあ、redisがWindowsを正式にはサポートしていないところを、動かしているということで、Windows版はどこか無理があるのかもしれません。
推測ですけど。
とはいえ。
redis版とConcurrentMapCacheManager版が、これくらい簡単に使い分けられるというのは、すごいです。
最後に、キャッシュ全般についてです。
これは個人的な感想ですが。
キャッシュを設定するのは、本当に繰り返し利用する頻度の高いメソッドだけにした方が良いなと思ってます。
キャッシュをつけたり、はずしたりの試行錯誤の結果です。
初回実行時には同じだけ処理時間はかかります。
だから、1回か2回単発的に動くだけのメソッドにつけても、パフォーマンスはあがりません。
その上、使わないキャッシュがメモリ上に溜まって、メモリだけを圧迫していきます。
そのあたり、注意は必要かな。