Caffeine Cache


Cache


コンピュータ科学においてデータや値を予め複製する一時的な場所を指す.
データをキャッシュに事前にコピーすると、計算やアクセス時間を必要とせずにデータに迅速にアクセスできます.

Global Cache



1.複数のサーバ(WAS)リファレンスキャッシュサーバ
2.複数のサーバ間でのデータ共有が容易
3.ネットワークの使用速度がローカルキャッシュより遅い
4.代表的なRedis、Medicached

Local Cache



1.サーバごとにキャッシュを個別に保存する(データ整合性の問題が発生する可能性がある)
2.サーバ間でのデータ共有が困難
3.サーバ内ストレージ、高速化
4.典型的なCaffeine、Ehcache

キャッシュの適用先

  • 頻繁に照会されるデータ
  • 頻繁に更新されないデータ
  • 入出力値が一致するデータ
  • 2. Spring Boot Cache


    2-1. アプリケーションコード


    1.依存項目の追加:spring-boot-start-cache

    //   build.gradle
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache'

    2.@EnableCaching追加

    // XXAplication.java
    ...
    @EnableCaching
    public class XXApplication {
    	...
        public static void main(String args[]) {
        	...
        }
    }

    3.CacheManager Beanの登録

    // CacheConfig.java
    @Configuration
    public class CacheConfig { 
       @Bean
       public CacheManager cacheManager() {
          SimpleCacheManager manager = new SimpleCacheManager();
          manager.setCaches(Arrays.asList(
             new ConcurrentMapCache("cache-1"),
             new ConcurrentMapCache("cache-2")
          ));
          return manager;
       }
    }

    4.キャッシュの使用

    // XXXService.java
    public class XXXService {
       ...
       @Cacheable(value = "cache-1")
       public String getValue(String parameter) {
          ...
          return value;
       }
       
       @CacheEvict(value = "cache-1")
       public String method(String parameter) { ... }
       
       @CachePut(value = "cache-1")
       public String method(String parameter) { ... } 
    }

    2-2. Annotations


    AnnotationsDescriptions@EnableCaching-キャッシュ機能を有効にする-キャッシュマネージャbeanを呼び出し、Springが管理@キャッシュを開始したときに値を返します.ない場合は、新規登録-メソッドの戻り値をキャッシュに保存@CacheEvet-Cache削除-リソース変更操作の実行時に@CachePut-Cacheデータリフレッシュを適用

    3. Caffeine


    vs EHCACHE

  • xml X
  • を使用

    vs SimpleCacheManager

  • TTL利用可能
  • 最大サイズ設定可能
               
  • 3-1. アプリケーションコード


    全体の使い方は2です.Spring Boot Cacheコードと同じ

    1.Dependency:Caffeineの追加

    // build.gradle
    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache'
    implementation group: 'com.github.ben-manes.caffeine', name: 'caffeine'

    2.キャッシュの定義

    // CacheType.java
    @Getter
    public enum CacheType {
       CACHE("name", 1L, 1L);
    
       CacheType(String name, Long expireTime, Long maximumSize) {
          this.name = name;
          this.expireTime = expireTime;
          this.maximumSize = this.maximumSize;
       }
       
       private String name;
       private Long expireTime;
       private Long maximumSize;
    }

    3.Cache ManagerにCacheを登録する

    // CacheConfig.java
    @Configuration
    public class CacheConfig {
       @Bean
       public CacheManager manager {
          SimpleCacheManager manager = new SimpleCacheManager();
          List<CaffeineCache> caches = Arrays.stream(CacheType.values())
             .map(cache -> new CaffeineCache(cache.getName(), Caffeine.newBuilder()
                .expireAfterWrite(cache.getExpireTime(), TimeUnit.MINUTS)
                .maximumSize(cache.getMaximumSize())
                .build())
             .collect(Collectors.toList());
       }
    }

    疑問点


    Q.Caffeine CacheManagerではなくCaffeine Cacheを使う理由は?
    A.CaffeineCacheManagerとSimpleCacheManagerは、ConcurrentMapを使用しています.コードの読み取り可能性の高い単純モードマネージャを使用してbeanを登録することを決定します.
    問:MaximumCountの意味は何ですか.
    A.@Cacheableが保留されると、cacheが適用され、設定方法のパラメータで最大何個の入力値を指定できますか.

    References


    Cache

  • https://goldfishhead.tistory.com/29
  • https://chagokx2.tistory.com/98
  • Caffeine

  • blog.yevgnenll.me/posts/spring-boot-with-caffeine-cache
  • EHCACHE

  • https://jaehun2841.github.io/2018/11/07/2018-10-03-spring-ehcache
  • https://db-engines.com/en/system/Ehcache