Политика устаревания записей (Expiry Policy)#
Политика устаревания записей (expiryPolicy) определяет, сколько времени должно пройти до устаревания и удаления записи. Отсчет времени можно вести с момента создания, изменения или последнего доступа к записи.
В зависимости от конфигурации памяти записи удаляются из оперативной памяти или с диска:
Режим полностью in-memory (данные хранятся только в оперативной памяти) — устаревшие записи удаляются из оперативной памяти.
Персистентный режим (Native Persistence) — устаревшие записи удаляются из оперативной памяти и с диска. Политика устаревания удаляет записи из файлов партиций без освобождения места. После удаления дисковое пространство можно повторно использовать для добавления новых записей.
Режим in-memory + внешнее хранилище — устаревшие записи удаляются только из оперативной памяти (из DatGrid) и не удаляются из внешнего хранилища (из RDBMS, NoSQL и других баз данных).
Режим in-memory + SWAP — устаревшие записи удаляются из ОЗУ и файлов SWAP.
Чтобы установить политику устаревания записей, используйте любую из стандартных реализаций javax.cache.expiry.ExpiryPolicy или создайте собственную.
Настройка#
Пример конфигурации expiryPolicy:
XML:
<bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="name" value="myCache"/> <property name="expiryPolicyFactory"> <bean class="javax.cache.expiry.CreatedExpiryPolicy" factory-method="factoryOf"> <constructor-arg> <bean class="javax.cache.expiry.Duration"> <constructor-arg value="MINUTES"/> <constructor-arg value="5"/> </bean> </constructor-arg> </bean> </property> </bean>Java:
CacheConfiguration<Integer, String> cfg = new CacheConfiguration<Integer, String>(); cfg.setName("myCache"); cfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.FIVE_MINUTES));C#/.NET:
class ExpiryPolicyFactoryImpl : IFactory<IExpiryPolicy> { public IExpiryPolicy CreateInstance() { return new ExpiryPolicy(TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(100), TimeSpan.FromMilliseconds(100)); } } public static void Example() { var cfg = new CacheConfiguration { Name = "cache_name", ExpiryPolicyFactory = new ExpiryPolicyFactoryImpl() };
Также можно изменить или установить политику устаревания для отдельных операций кеша. Для этого используется специальная обертка кеша, а политика применяется для каждой кеш-операции:
CacheConfiguration<Integer, String> cacheCfg = new CacheConfiguration<Integer, String>("myCache");
ignite.createCache(cacheCfg);
IgniteCache cache = ignite.cache("myCache")
.withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.MINUTES, 5)));
// Если кеш не содержит ключ 1, срок действия записи истечет через 5 минут.
cache.put(1, "first value");
Тонкий клиент также позволяет устанавливать и менять политику устаревания для отдельных записей — подробнее об этом написано в официальной документации Apache Ignite.
Eager TTL#
Устаревшие записи можно удалять из кеша сразу или при первом обращении к ним во время кеш-операции. Данное поведение задается с помощью параметра eagerTtl в конфигурации кеша.
Если есть хотя бы один кеш, который настроили с eager TTL (eagerTtl=true), DataGrid создает один поток для удаления устаревших записей в фоновом режиме.
Если у параметра eagerTtl установлено значение false, устаревшие записи удалятся не сразу, а при запросе потоком, который выполняет кеш-операцию. Значение CacheConfiguration.eagerTtl по умолчанию — true.
Настройка параметра eagerTtl:
XML:
<bean class="org.apache.ignite.configuration.CacheConfiguration"> <property name="eagerTtl" value="true"/> </bean>Java:
CacheConfiguration<Integer, String> cfg = new CacheConfiguration<Integer, String>(); cfg.setName("myCache"); cfg.setEagerTtl(true);C#/.NET:
var cfg = new CacheConfiguration { Name = "cache_name", EagerTtl = true };