アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

SpringBootでSpringのキャッシュ機構を使う2回目。redisを格納先として使う。STS+SpringBoot

 前回、外部格納先を使わないパターンでSpringのキャッシュ機構を使ってみました。 

今回は、 Springのキャッシュ機構で、外部格納先として、redisを利用するパターンをやってみます。 

ちなみにredisとは、NO-SQLのインメモリDBのひとつです。 

KVS(Key-Value Store=キー・バリュー型データベース)なのですが、ハッシュなどの型も使えたり、オプションで永続性を持たせることができるなどの特徴があります。 

インメモリDBはとても高速なので、キャッシュ機構に使うには、とても適していますよね。

 

まずはredisをインストールします。

 

Windows10の環境にインストールしようと思うのですが、残念ながら、redisは正式にはWindowsをサポートしていません。 

なんですが、最近はマイクロソフトが、MsOpenTechという取り組みで、オープンソースプロジェクトのプロダクトのWindowsバイナリを提供してくれています。 

redisもありました。・・ありがたいですね。

github.com

 こんな感じで複数のバージョンが表示されます。

 今回は、3.0.504を選んでみます。

f:id:arakan_no_boku:20170806082307j:plain

 

Redis-x64-3.0.504.msiをダウンロードしてインストールします。 

普通にWindowsインストーラが起動するので、Nextを押してデフォルトのまま進めば、OKです。 

気をつけるのは次の2点です。

  •  途中で動作するポートを指定する画面がでてきます。デフォルトの6379のままにしておくことをおすすめします。
  • 利用するメモリの上限を設定する画面がでてきます。デフォルトだと無制限ですが、キャッシュで利用するだけであれば、limitにチェックをつけて、100MBから200MB程度までの利用にしておくほうがいいです。特に、Windows環境で無制限にすると、時々起動しないトラブルがあるみたいです。

確認はサービスで、redisが動いていればOKです。

f:id:arakan_no_boku:20170806084002j:plain

 

redisをプロジェクトに組み込む

 

さて、redisのインストールができたら、今度はプロジェクトに組み込みます。 

まず、pom.xmlに以下の依存関係を追加します。

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

  そして、前回、作ったCachingConfigクラスを変更します。

 

@Configuration
@EnableCaching
public class CachingConfig {


 }

上記のように、空のクラスにしてください。 

この変更だけで、前回作成したキャッシュ操作のクラスはそのまま動きます。 

ソースコードはこちらで確認してください。

arakan-pgm-ai.hatenablog.com

AutoConfigureの対象になっているみたいです。 

だから、@EnableCachingを定義て空クラスを作るだけで、自動的にredisをキャッシュ機構で使えるようになっているのですね。 

設定は、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回単発的に動くだけのメソッドにつけても、パフォーマンスはあがりません。 

その上、使わないキャッシュがメモリ上に溜まって、メモリだけを圧迫していきます。 

総合的に見て、乱用はあまり、メリットはありませんでしたね。 

実感として。 

前回の記事

arakan-pgm-ai.hatenablog.com 

f:id:arakan_no_boku:20170725215801j:plain