LoginSignup
1
0

More than 3 years have passed since last update.

Spring CacheでキャッシュをRedisに保存する際の有効期間の指定について

Posted at

経緯

Redisの有効期間指定を調べたが、記載が古くそのまま使える情報が少なかったため記事を作成する※20200827時点で調査

Spring CacheでRedisにデータごとの有効期間指定ができることを確認する

build.gradle
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
設定クラスを作成
@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory fac) {

        // 1.キャッシュビルダーからキャッシュを作成する
        RedisCacheManagerBuilder builder = RedisCacheManager.builder(fac);
        builder
            .cacheDefaults(
        // 2.デフォルトのキャッシュ有効期限を設定する
                    RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1)))
        // 3.cache1という名称のキャッシュに対し、有効期限を設定する
            .withCacheConfiguration("cache1", 
                    RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(1)))
        // 3.cache2という名称のキャッシュに対し、有効期限を設定する
            .withCacheConfiguration("cache2", 
                    RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)));

        return builder.build();
    }
}

補足

1.

  • RedisCacheManagerはスタティックな内部クラスであるビルダーを介して作成します
  • 引数にFactoryでなくRedisCacheWriterも指定できる(内部的にはFacroty⇒RedisCacheWriterと変換しており、入口はどちらでもよい)
  • 以下のようにするとビルダーを使わなくても作ることができる。この場合デフォルト有効期限(期間無限)となります。
// facは、RedisConnectionFactory型
RedisCacheManager rcm = RedisCacheManager.create(fac);

2.

  • デフォルトの有効期限と、データ毎の有効期限は設定するメソッドが異なる

3.

  • 有効期間はDurationを利用して日付や時間など柔軟に設定できる
  • データごとにの設定は内部にMAPをもっている
  • withInitialCacheConfigurationsメソッドをつかうと、設定内容をあらかじめ作成したMAPでまとめて登録もできる
動作確認用のコントローラ(cache1とcache2を作成する)
@RestController
@RequestMapping("/api/sample")
public class SampleRedisCacheController {

    @Autowired
    CacheManager cm;

    @GetMapping("redisCache")
    public String redisCache() {

        Cache c1 = cm.getCache("cache1");
        c1.put("k1", 123456);
        c1.put("k2", 234567);

        Cache c2 = cm.getCache("cache2");
        c2.put("k1", 123456);
        c2.put("k2", 234567);

        return "redis cache test";
    }
}

確認結果

  • 以下にアクセスし、Redisにキャッシュが作成されること
     http://localhost:8080/api/sample/redisCache

  • Redisの有効期限が、設定クラス通りであること
    image.png
    ※TTL発行まで時間がたったの時間が少したってしまっている

コメント

CacheManagerクラスの中身は難しそうに思えたが、作り方や色々な設定について理解できた。
ビルダーはEffectiveJavaに記載があった。コンストラクタの引数が多くなる場合に使うと便利ということで紹介されていた気がする。今回設定値が多いので導入されているのだと思う。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0