1. 概要

この短いチュートリアルでは、RedisをSpring Bootキャッシュのデータストアとして構成する方法を見ていきます。

2. 依存関係

開始するには、spring-boot-starter-cacheおよびspring-boot-starter-data-redisアーティファクトを追加しましょう。

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

これらはキャッシュサポートを追加し、必要なすべての依存関係をもたらします。

3. 構成

上記の依存関係と@EnableCachingアノテーションを追加することにより、SpringBootはデフォルトのキャッシュ構成でRedisCacheManagerを自動構成します。 ただし、いくつかの便利な方法で、キャッシュマネージャーの初期化の前にこの構成を変更できます。

まず、RedisCacheConfigurationBeanを作成しましょう。

@Bean
public RedisCacheConfiguration cacheConfiguration() {
    return RedisCacheConfiguration.defaultCacheConfig()
      .entryTtl(Duration.ofMinutes(60))
      .disableCachingNullValues()
      .serializeValuesWith(SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
}

これにより、デフォルト構成をより細かく制御できます。たとえば、必要な存続時間(TTL)値を設定し、実行中のキャッシュ作成のデフォルトのシリアル化戦略をカスタマイズできます。

キャッシング設定を完全に制御するために、独自のRedisCacheManagerBuilderCustomizerBeanを登録しましょう。

@Bean
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
    return (builder) -> builder
      .withCacheConfiguration("itemCache",
        RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)))
      .withCacheConfiguration("customerCache",
        RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)));
}

ここでは、RedisCacheManagerBuilderRedisCacheConfigurationを使用して、itemCachecustomerCacheのTTL値をそれぞれ10分と5分に構成しました。 これは、 null 値、キープレフィックス、バイナリシリアル化など、キャッシュごとの動作をさらに微調整するのに役立ちます。

Redisインスタンスのデフォルトの接続の詳細はlocalhost:6379であることに注意してください。 Redis構成を使用して、ホストとポートとともに低レベルの接続の詳細をさらに微調整できます。

4. 例

この例では、データベースからアイテム情報を取得するItemServiceコンポーネントがあります。 事実上、これは潜在的にコストのかかる操作であり、キャッシングに適した候補です。

まず、組み込みRedisサーバーを使用してこのコンポーネントの統合テストを作成しましょう。

@Import({ CacheConfig.class, ItemService.class})
@ExtendWith(SpringExtension.class)
@EnableCaching
@ImportAutoConfiguration(classes = { 
  CacheAutoConfiguration.class, 
  RedisAutoConfiguration.class 
})
class ItemServiceCachingIntegrationTest {

    @MockBean
    private ItemRepository mockItemRepository;

    @Autowired
    private ItemService itemService;

    @Autowired
    private CacheManager cacheManager;

    @Test
    void givenRedisCaching_whenFindItemById_thenItemReturnedFromCache() {
        Item anItem = new Item(AN_ID, A_DESCRIPTION);
        given(mockItemRepository.findById(AN_ID))
          .willReturn(Optional.of(anItem));

        Item itemCacheMiss = itemService.getItemForId(AN_ID);
        Item itemCacheHit = itemService.getItemForId(AN_ID);

        assertThat(itemCacheMiss).isEqualTo(anItem);
        assertThat(itemCacheHit).isEqualTo(anItem);

        verify(mockItemRepository, times(1)).findById(AN_ID);
        assertThat(itemFromCache()).isEqualTo(anItem);
    }
}

ここでは、キャッシュ動作のテストスライスを作成し、getItemForIdを2回呼び出します。 最初の呼び出しはリポジトリからアイテムを取得する必要がありますが、2番目の呼び出しはリポジトリを呼び出さずにキャッシュからアイテムを返す必要があります。

最後に、Springの@Cacheableアノテーションを使用してキャッシュ動作を有効にしましょう。

@Cacheable(value = "itemCache")
public Item getItemForId(String id) {
    return itemRepository.findById(id)
      .orElseThrow(RuntimeException::new);
}

これにより、以前に構成したRedisキャッシュインフラストラクチャに依存しながら、キャッシュロジックが適用されます。 データの更新や削除など、Springキャッシングの抽象化のプロパティと動作の制御に関する詳細については、Springでのキャッシングガイドを参照してください。

5. 結論

この記事では、SpringキャッシングにRedisを使用する方法を見てきました。

最初に、最小限の構成でRedisキャッシングを自動構成する方法について説明しました。 次に、構成Beanを登録することにより、キャッシュ動作をさらにカスタマイズする方法を検討しました。

最後に、このキャッシングを実際に示すためのサンプルユースケースを作成しました。

いつものように、完全なソースコードはGitHubから入手できます。