Помните локальный кэш java encache

задняя часть

Кэширование кеша JVM

В кеше JVM есть часто используемая структура кэширования, котораяencache, Итак, вот некоторое введение в encache, эта статья основана на версии 3.8, чтобы представить некоторые новые функции.encacheВ основном состоит из трех компонентовCacheManager,Cacheа такжеCacheConfiguration. Иерархия одного кэша выглядит следующим образом:

image

Структура CacheManager

image

Структура кэша

image

Структура конфигурации CacheConfiguration

image

Иерархическая структура инкеша

в официальном использованииencacheКогда , давайте сначала разберемся в его стратегии кэширования, то есть где находится кэшированное значение, что поможет нам понятьencache. Он имеет три стратегии кэширования: кэширование в куче, кэширование вне кучи и кэширование на диске.Соответствующие конфигурации иерархической структуры:heap,offheap,disk.

как использовать?

Импорт зависимостей:

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.8.0</version>
</dependency>

При использовании кластера:

<dependency>
     <groupId>org.ehcache</groupId>
     <artifactId>ehcache-clustered</artifactId>
     <version>3.8.0</version>
</dependency>

Настроить с помощью кода Java

Мы можем использовать код Java, чтобы получитьCacheпример.

CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()//声明一个cacheBuilder
            .withCache("myCache",CacheConfigurationBuilder
                        .newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.heap(20)))//声明一个容量为20的堆内缓存
                .build(true);
Cache<String,String> myCache =  cacheManager.getCache("myCache",String.class,String.class);//获取这个cache
      myCache.put("key1","v1");//使用
      System.out.println(myCache.get("key1"));
      //移除
      cacheManager.removeCache("myCache");
      cacheManager.close();

Настроить с помощью xml

используйте xml для настройкиCacheManager, см. XML-конфигурациюcache.xml. Строительный код выглядит следующим образом:

 //获取配置资源
        URL configUrl =  new XmlGetStarted().getClass().getResource("/cache.xml");
        //从xmlConfig构造一个CacheManger并且初始化
        Configuration xmlConfig = new XmlConfiguration(configUrl);
        CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfig);
        cacheManager.init();
        Cache<String,String> cache = cacheManager.getCache("c1",String.class,String.class);
        cache.put("K","V");
        System.out.println(cache.get("K"));

Создайте CacheManager с поддержкой кластера

Encacheможно использоватьterracottaКластеризация поддерживается. Вот код для поддержки кластера:

CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
                CacheManagerBuilder.newCacheManagerBuilder()
                        .with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application"))
                                .autoCreate(c -> c));
        PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true);
        cacheManager.close();

Обновление данных

в конфигурацииCacheConfiguration, мы можем настроить кешированиеExpiry, то есть политику истечения срока действия, конкретный код конфигурации выглядит следующим образом:

CacheConfigurationBuilder
                .newCacheConfigurationBuilder(String.class,String.class,ResourcePoolsBuilder.heap(20))
                .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofHours(20)));

encacheСуществует три типа стратегии экспирации:
timeToLiveExpiration: рассчитывается с момента создания записи кэша и истекает через определенный период времени.
timeToIdleExpiration: рассчитывается на основе последнего доступа к записи кэша, действует только запись кэша в куче
noExpiration: никогда не заканчивается

Сериализация данных кэша на диск

можно использоватьencacheиерархически структурированныйdiskдля сериализации данных.

long begin = System.currentTimeMillis();
        PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
                .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData")))//序列化到磁盘的路径
                .withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
                        ResourcePoolsBuilder.newResourcePoolsBuilder()
                                .disk(500, MemoryUnit.MB, true)
                        )//声明单个cache的配置
                )
                .build(true);

        Cache<Long,String> cache = persistentCacheManager.getCache("persistent-cache",Long.class, String.class);
        for (int i=0;i<SIZE;i++){
            cache.put(Long.valueOf(i),String.valueOf(i));
            System.out.println(cache.get(Long.valueOf(i)));
        }
        System.out.println("cost time:"+(System.currentTimeMillis()-begin));
        persistentCacheManager.close();

Таким образом, вpersistentCacheManager.close()Кэш будет автоматически сброшен на диск, а данные с диска будут загружены при запуске.