戦略 Scala 日記

素人プログラマの思考のセンス

GuavaのChacheをScalaから使って、定期的にインスタンス変数のキャッシュをリセットする

GuavaのChacheをScalaから使って、定期的にインスタンス変数のキャッシュをリセットする

DBのコネクション数などを考えれば、Remote Actorのインスタンス変数に、 値をキャッシュするようなケースは容易に想像できる。

このインスタンス変数でキャッシュをするような場合に、これを定期的にリフレッシュする方法として、 Google製のJavaライブラリGuavaから、Cacheを使うやり方を紹介する。

下記の例では、cache.get()で、所定のキーを呼び出しそのキーが存在する場合は、キーに対応する値を返す。 cacheにキーが存在しない場合、Callableインスタンス化することで、callメソッドでキーに対応する値を返すようにしている。

このキャッシュを1秒間でリセットするようにしており、Thread.sleep(1000)をした後、cacheに対してキーを呼び出すと、callが再度呼び出されるはずである。

object cacheTest {

  def main(args: Array[String]) = {
    val cache: Cache[String,String] = CacheBuilder
      .newBuilder().maximumSize(10).expireAfterWrite(1, java.util.concurrent.TimeUnit.SECONDS).build()

    val a1 = cache.get("aa", new Callable[String] {
      def call(): String = {
        println("called")
        "hoge"
      }
    })

    println(a1)

    val a2 = cache.get("aa", new Callable[String] {
      def call(): String = {
        println("called")
        "hoge"
      }
    })

    println(a2)

    Thread.sleep(1000)

    val a3 = cache.get("aa", new Callable[String] {
      def call(): String = {
        println("called")
        "hoge"
      }
    })

    println(a3)


  }

}

これを実行すると、出力は次のようになる。

called
hoge
hoge
called
hoge