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