現代のアプリケーション開発では、パフォーマンスとスケーラビリティがシステムの成功または失敗を決定する重要な要素です。キャッシュは、データベースの負荷を軽減し、待ち時間を短縮し、シームレスなユーザー エクスペリエンスを確保することで、これらを改善する上で重要な役割を果たします。ただし、すべてのシナリオに完璧な単一のキャッシュ ソリューションはありません。
ローカル キャッシュ (Caffeine など) はメモリ内でアプリケーションの近くで実行されるため、非常に高速です。これらは、頻繁にアクセスされるデータの応答時間を短縮するのに最適です。一方、分散キャッシュ (Redisson の Redisson など) は、アプリケーションの複数のインスタンスにわたってスケーラビリティと一貫性を提供します。分散キャッシュにより、分散システム内のすべてのノードが同じ最新データにアクセスできるようになります。これはマルチノード環境では重要です。 ただし、ローカルまたは分散キャッシュのみに依存すると、次のような課題が生じる可能性があります。
分散環境ではデータ更新がノード間で同期していないため、
が効果的なソリューションになります。 Caffeine と Redisson を使用してローカル キャッシュと分散キャッシュの利点を組み合わせることで、分散キャッシュの一貫性とスケーラビリティを維持しながら、ローカル キャッシュ速度の高いパフォーマンスを得ることができます。 この記事では、Spring Boot アプリケーションにハイブリッド キャッシュを実装して、最適なパフォーマンスとデータの一貫性を確保する方法について説明します。
実装手順
pom.xml
<code class="language-xml"><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.43.0</version> </dependency></code>
主要コンポーネントの詳細な説明
<code class="language-java">@Configuration @EnableCaching public class CacheConfig implements CachingConfigurer { @Value("${cache.server.address}") private String cacheAddress; @Value("${cache.server.password}") private String cachePassword; @Value("${cache.server.expirationTime:60}") private Long cacheExpirationTime; @Bean(destroyMethod = "shutdown") RedissonClient redisson() { Config config = new Config(); config.useSingleServer().setAddress(cacheAddress).setPassword(cachePassword.trim()); config.setLazyInitialization(true); return Redisson.create(config); } @Bean @Override public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(cacheExpirationTime, TimeUnit.MINUTES)); return cacheManager; } @Bean public CacheEntryRemovedListener cacheEntryRemovedListener() { return new CacheEntryRemovedListener(cacheManager()); } @Bean @Override public CacheResolver cacheResolver() { return new LocalCacheResolver(cacheManager(), redisson(), cacheEntryRemovedListener()); } }</code>
を使用してメモリ内キャッシュを有効にし、CacheManager
経由で有効期限ポリシーを構成します。 CaffeineCacheManager
Caffeine
2. キャッシュリゾルバー
はローカル (Caffeine) キャッシュと分散 (Redisson) キャッシュを接続して、ハイブリッド戦略が効果的に適用されるようにします。 CacheResolver
LocalCacheResolver
<code class="language-java">@Component public class LocalCacheResolver implements CacheResolver { // ... (代码与原文相同) ... }</code>
<code class="language-java">public class LocalCache implements Cache { // ... (代码与原文相同) ... }</code>
<code class="language-xml"><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.43.0</version> </dependency></code>
アノテーションメソッドが実行されると、@Cacheable
メソッドが呼び出されます。これにより、データはローカルキャッシュと分散キャッシュ(REDIS)に保存されます:put
<code class="language-java">@Configuration @EnableCaching public class CacheConfig implements CachingConfigurer { @Value("${cache.server.address}") private String cacheAddress; @Value("${cache.server.password}") private String cachePassword; @Value("${cache.server.expirationTime:60}") private Long cacheExpirationTime; @Bean(destroyMethod = "shutdown") RedissonClient redisson() { Config config = new Config(); config.useSingleServer().setAddress(cacheAddress).setPassword(cachePassword.trim()); config.setLazyInitialization(true); return Redisson.create(config); } @Bean @Override public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(cacheExpirationTime, TimeUnit.MINUTES)); return cacheManager; } @Bean public CacheEntryRemovedListener cacheEntryRemovedListener() { return new CacheEntryRemovedListener(cacheManager()); } @Bean @Override public CacheResolver cacheResolver() { return new LocalCacheResolver(cacheManager(), redisson(), cacheEntryRemovedListener()); } }</code>
<code class="language-java">@Component public class LocalCacheResolver implements CacheResolver { // ... (代码与原文相同) ... }</code>
注釈を介して)、キーは分散キャッシュから削除されます。他のノードのローカルキャッシュには、同じキーを削除するために通知されます。
@CacheEvict
CacheEntryRemovedListener
<code class="language-java">public class LocalCache implements Cache { // ... (代码与原文相同) ... }</code>
以上がSpring Boot のハイブリッド キャッシュ戦略: Redisson と Caffeine の統合ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。