バックエンド

【Java】Play Framework 2.7でキャッシュを使ってみよう!

play-framework-cache

こんばんは!光です。

大手グローバル企業でWebエンジニアをやっています。

Webエンジニアを目指してプログラミングを勉強している初心者の方向けに情報を発信しています。

経歴や実績はこちら

システム開発のお仕事の依頼もお待ちしております。

お問い合わせページTwitterのDMからお気軽にお問い合わせください!

今回はこのような質問をいただきました。

Play Frameworkでのキャッシュの使い方教えて!

キャッシュは使いこなせばかなり便利ですよね。

そこで今回はこちらの質問について解説していきます!

2019年に書いた内容なので少し情報古いです!

環境
  • Play Framework:2.7.3
  • OS : macOS Catalina バージョン 10.15
  • Java : 1.8.0_131
  • sbt : 0.13.16
  • IDE : IntelliJ IDEA Ultimate 2019.2

キャッシュを使ってみよう!

今回はehcacheのラッパークラス、CacheUtilsを作ってみます。

ehcacheをインポートしよう!

ehcacheをインポートします。

build.sbtに1行加えるだけ!

libraryDependencies += ehcache

CacheUtilsを作成しよう!

ラッパークラスのCacheUtilsを作成します。

そのまま使うと毎回コントローラ側でDI(@Inject)しないといけないので、ちょっとめんどくさいんですよね。

特に解説するほど難しい記述はないですが、挙げるとしたらキャッシュ時間の指定方法。

10秒だったら「10s」、3分だったら「3mn」、8時間だったら「8h」のように指定します。

import play.cache.SyncCacheApi;
import play.libs.Time;

import javax.inject.Inject;
import java.util.Optional;

/**
 * キャッシュユーティリティ
 */
public class CacheUtils {
    private static SyncCacheApi cacheApi;

    @Inject
    public CacheUtils(SyncCacheApi syncCacheApi) {
        cacheApi = syncCacheApi;
    }

    /**
     * キャッシュを取得する
     *
     * @param key キー
     * @return Optional
     */
    public static <T> Optional<T> getOptional(String key) {
        return cacheApi.getOptional(key);
    }

    /**
     * キャッシュをセットする
     *
     * @param key   キー
     * @param value 値
     */
    public static void set(String key, Object value) {
        cacheApi.set(key, value, Time.parseDuration(null));
    }

    /**
     * キャッシュをセットする(時間指定)
     *
     * @param key        キー
     * @param value      Element value
     * @param expiration Ex: 10s, 3mn, 8h
     */
    public static void set(String key, Object value, String expiration) {
        cacheApi.set(key, value, Time.parseDuration(expiration));
    }

    /**
     * キャッシュを削除する
     *
     * @param key キー
     */
    public static void delete(String key) {
        cacheApi.remove(key);
    }
}

CacheUtilsを呼び出してみよう!

実際にCacheUtilsを呼び出してみます。

シンプルな作りなので簡単に使えると思います。

セットしてゲットするだけなので簡単に使えます。

“abcd”というキーに1234というInteger型をセットしています。(キャッシュ時間1分指定)

CacheUtils.set("abcd", 1234, "1mn");
Optional<Integer> cacheOptional = CacheUtils.getOptional("abcd");
cacheOptional.ifPresent(System.out::println);
1234

おまけ

今回、このようなエラーが頻繁にでました。

Compilation error
警告が見つかり-Werrorが指定されました

Play Framework 2.6で使っていたソースコードを使い回しても、出るときは出ます。

結構悩んだのですが、どうやら非推奨のメソッドを呼び出そうとするとこのエラーが出るみたいです。

このエラーが出た場合は非推奨のメソッドを呼び出していないか確認してみてください。

Play Framework 2.7だと非推奨のメソッド使えないんですね。

設定変えれば使えるようになったと思いますが、使わないほうが良いです!

あとがき

キャッシュってかなり便利ですよね。

レスポンス速度上げるために使ったり、値を引き回すためにつかったり…

CacheUtilsを用意しておくと、どこにでも使い回せるので最初に用意しておくと便利だと思います。

良ければコピペして使ってみてください!

あと非推奨のメソッドは使わないように!