Кэширование кеша JVM
В кеше JVM есть часто используемая структура кэширования, котораяencache, Итак, вот некоторое введение в encache, эта статья основана на версии 3.8, чтобы представить некоторые новые функции.encacheВ основном состоит из трех компонентовCacheManager,Cacheа такжеCacheConfiguration. Иерархия одного кэша выглядит следующим образом:
Структура CacheManager
Структура кэша
Структура конфигурации CacheConfiguration
Иерархическая структура инкеша
в официальном использовании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()Кэш будет автоматически сброшен на диск, а данные с диска будут загружены при запуске.