Near-кеши#
Near-кеш — локальный кеш, хранящий данные на локальном узле, которые запрашивали недавно или чаще всего. Например, приложение запускает клиентский узел и регулярно запрашивает справочные данные (коды стран). Так как клиентские узлы не хранят данные, запросы всегда извлекают их с удаленных узлов. Настройка near-кешей позволит хранить коды стран на локальном узле во время работы приложения.
Near-кеш настраивается для обычного кеша и содержит данные только для него. Near-кеш хранит данные в heap-памяти. Максимальный размер кеша и политики вытеснения записей для near-кеша можно настроить отдельно.
Важно
Near-кеш полностью транзакционный и автоматически обновляется или становится недействительным при каждом обновлении данных на серверных узлах.
Настройка near-кеша#
Пример, как настроить near-кеш для конкретного кеша:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="myCache"/>
<property name="nearConfiguration">
<bean class="org.apache.ignite.configuration.NearCacheConfiguration">
<property name="nearEvictionPolicyFactory">
<bean class="org.apache.ignite.cache.eviction.lru.LruEvictionPolicyFactory">
<property name="maxSize" value="100000"/>
</bean>
</property>
</bean>
</property>
</bean>
// Настройте near-кеш для `myCache`.
NearCacheConfiguration<Integer, Integer> nearCfg = new NearCacheConfiguration<>();
// Используйте политику вытеснения записей LRU, чтобы автоматически вытеснять из near-кеша
// записи каждый раз, когда их количество достигает 100 000.
nearCfg.setNearEvictionPolicyFactory(new LruEvictionPolicyFactory<>(100_000));
CacheConfiguration<Integer, Integer> cacheCfg = new CacheConfiguration<Integer, Integer>("myCache");
cacheCfg.setNearConfiguration(nearCfg);
// Создайте распределенный кеш на серверных узлах.
IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cacheCfg);
var cacheCfg = new CacheConfiguration
{
Name = "myCache",
NearConfiguration = new NearCacheConfiguration
{
EvictionPolicy = new LruEvictionPolicy
{
MaxSize = 100_000
}
}
};
var cache = ignite.GetOrCreateCache<int, int>(cacheCfg);
Если настроить near-кеш как в примере выше, он создастся на любом узле, который запрашивает данные из основного кеша (включая серверные и клиентские узлы). Near-кеш создается на серверных и толстых клиентских узлах, но не создается на тонких клиентских узлах.
При получении экземпляра кеша и работе с ним запросы будут происходить через near-кеш.
IgniteCache<Integer, Integer> cache = ignite.cache("myCache");
int value = cache.get(1);
Near-кеш наследует большую часть базовых параметров конфигурации кеша. Например, если в базовом кеше настроена политика устаревания записей, срок действия записей в near-кеше истекает на основе этой же политики. Подробнее о ней написано в разделе «Политика устаревания записей (Expiry Policy)».
Параметры, которые не наследуются от конфигурации основного кеша:
Параметр |
Описание |
Значение по умолчанию |
|---|---|---|
|
Политика вытеснения записей для near-кеша. Подробнее о ней написано в подразделе «Политика вытеснения данных из кеша (Eviction Policies)» раздела «Настройка памяти» |
— |
|
Начальное количество записей, которое содержит near-кеш |
|
Динамическое создание near-кешей на клиентских узлах#
При создании запроса с клиентского узла в кеш, для которого не был настроен near-кеш, его можно создать динамически. Это повысит производительность за счет хранения «горячих» данных локально на стороне клиентского узла. Такой near-кеш будет работать только на узле, где он был создан.
Чтобы создать near-кеш динамически, создайте его конфигурацию и передайте ее в качестве аргумента методу, который получает экземпляр кеша:
// Создайте конфигурацию для near-кеша.
NearCacheConfiguration<Integer, String> nearCfg = new NearCacheConfiguration<>();
// Используйте политику вытеснения записей LRU, чтобы автоматически вытеснять из near-кеша
// записи каждый раз, когда их количество достигает 100 000.
nearCfg.setNearEvictionPolicyFactory(new LruEvictionPolicyFactory<>(100_000));
// Получите кеш с названием `myCache` и создайте near-кеш для него.
IgniteCache<Integer, String> cache = ignite.getOrCreateNearCache("myCache", nearCfg);
String value = cache.get(1);
var ignite = Ignition.Start(new IgniteConfiguration
{
DiscoverySpi = new TcpDiscoverySpi
{
LocalPort = 48500,
LocalPortRange = 20,
IpFinder = new TcpDiscoveryStaticIpFinder
{
Endpoints = new[]
{
"xxx.x.x.x:48500..48520"
}
}
},
CacheConfiguration = new[]
{
new CacheConfiguration {Name = "myCache"}
}
});
var client = Ignition.Start(new IgniteConfiguration
{
IgniteInstanceName = "clientNode",
ClientMode = true,
DiscoverySpi = new TcpDiscoverySpi
{
LocalPort = 48500,
LocalPortRange = 20,
IpFinder = new TcpDiscoveryStaticIpFinder
{
Endpoints = new[]
{
"xxx.x.x.x:48500..48520"
}
}
}
});
// Создайте конфигурацию для near-кеша.
var nearCfg = new NearCacheConfiguration
{
// Используйте политику вытеснения записей LRU, чтобы автоматически вытеснять из near-кеша
// записи каждый раз, когда их количество достигает 100 000.
EvictionPolicy = new LruEvictionPolicy()
{
MaxSize = 100_000
}
};
// Получите кеш с названием `myCache` и создайте near-кеш для него.
var cache = client.GetOrCreateNearCache<int, string>("myCache", nearCfg);