如何解决Apache Ignite 2.x-我可以利用堆外存储并仍然有基于时间的逐出从堆上和堆外存储吗?
我正在使用Apache Ignite 2.8.1
我有一个需要在堆外存储的特定高速缓存(因为否则,我将受到内存不足情况的困扰)。而且我还需要分配缓存。
但是我还希望基于时间的驱逐策略从开/关内存缓存中逐出条目。
使用Apache Ignite 2.x甚至有可能吗?
在此处查看代码段。我尝试过每种方式进行配置,但是除了手动进行之外,没有其他方法可以从缓存中逐出这些条目。
当我运行下面的test
方法时,所有条目都保留在缓存中。
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;
import org.apache.ignite.Ignite;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cache.eviction.lru.LruevictionPolicyFactory;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.configuration.NearCacheConfiguration;
import org.apache.ignite.spi.discovery.tcp.TcpdiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpdiscoveryVmIpFinder;
public class IgniteCache {
private static final String ORG_CACHE = IgniteCache.class.getSimpleName() + "Organizations";
private static Ignite ignite;
private static org.apache.ignite.IgniteCache cache;
public void start() {
IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
DataStorageConfiguration dsCfg = new DataStorageConfiguration();
DataRegionConfiguration dfltDataRegConf = new DataRegionConfiguration();
dfltDataRegConf.setPersistenceEnabled(true);
dsCfg.setDefaultDataRegionConfiguration(dfltDataRegConf);
dsCfg.setStoragePath("E:\\igniteStorage");
igniteConfiguration.setDataStorageConfiguration(dsCfg);
TcpdiscoverySpi tcpdiscoverySpi = new TcpdiscoverySpi();
TcpdiscoveryVmIpFinder ipFinder = new TcpdiscoveryVmIpFinder();
ipFinder.setAddresses(Arrays.asList("127.0.0.1:47500..47509"));
tcpdiscoverySpi.setIpFinder(ipFinder);
igniteConfiguration.setdiscoverySpi(tcpdiscoverySpi);
ignite = Ignition.start(igniteConfiguration);
ignite.active(true);
CacheConfiguration<Long,X12File> cacheCfg = new CacheConfiguration<>(ORG_CACHE);
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
cacheCfg.setBackups(1);
cacheCfg.setevictionPolicyFactory(new LruevictionPolicyFactory<>(50000,40,5050)); // this doesn't do anything.
cacheCfg.setNearConfiguration(
new NearCacheConfiguration<Long,X12File>()
.setNearevictionPolicyFactory(new LruevictionPolicyFactory<>(1_000_000))); // this doesn't do anything.
cache = ignite.getorCreateCache(cacheCfg);
for (long i = 0; i < 4_000_000; i++) {
if (i > 0 && i % 10_000 == 0) {
System.out.println("Done: " + i);
}
cache.withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.SECONDS,1))) // this expiry policy doesn't do anything
.put(i,new X12File("x12file" + i,LocalDateTime.Now().toString()));
}
}
public void test() {
System.out.println("Checking if cache entries are being properly evicted ...");
int matches = 0;
for (long i = 0; i < 4_000_000; i++) {
if (cache.get(i) != null) {
++matches;
}
}
System.out.println("Matches: " + matches);
}
}
在我的特定用例中,这仅仅是Apache Ignite 2.x的缺点吗?
解决方法
简而言之:
- 逐出基于内存。删除一些记录,因为我有太多行或它使用了太多空间
- 到期时间是基于时间的。该记录在指定的时间内没有被触摸过,因此应将其删除
所有缓存都是堆外的。您可以为缓存配置the expiry policy,如下所示:
<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>
(堆上/堆附近的缓存确实做了。只是没有您所期望的!它们都在堆上,并且在上工作到堆外缓存。)
,据我从您的代码和您的解释中了解到,您似乎对驱逐政策和到期政策有些困惑。
- 驱逐策略确定如果RAM耗尽,应从RAM中删除哪些数据。
- 用于确定缓存条目的TTL的到期策略。
在您的情况下,您只需要有效期策略。看我的例子:
private static final String ORG_CACHE = IgniteCache.class.getSimpleName() + "Organizations";
public static void main(String[] args) throws Exception {
DataRegionConfiguration dfltDataRegConf = new DataRegionConfiguration();
dfltDataRegConf.setPersistenceEnabled(true);
DataStorageConfiguration dsCfg = new DataStorageConfiguration();
dsCfg.setDefaultDataRegionConfiguration(dfltDataRegConf);
dsCfg.setStoragePath("/home/kazakov/tmp");
IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
igniteConfiguration.setDataStorageConfiguration(dsCfg);
TcpDiscoverySpi tcpDiscoverySpi = new TcpDiscoverySpi();
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(Arrays.asList("127.0.0.1:47500..47509"));
tcpDiscoverySpi.setIpFinder(ipFinder);
igniteConfiguration.setDiscoverySpi(tcpDiscoverySpi);
try(Ignite ignite = Ignition.start(igniteConfiguration)) {
ignite.active(true);
CacheConfiguration<Long,X12File> cacheCfg = new CacheConfiguration<>(ORG_CACHE);
cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
cacheCfg.setBackups(1);
cacheCfg.setOnheapCacheEnabled(true);
IgniteCache<Long,X12File> cache = ignite.getOrCreateCache(cacheCfg).withExpiryPolicy(new CreatedExpiryPolicy(new Duration(TimeUnit.SECONDS,1)));
for (long i = 0; i < 4_000_000; i++) {
if (i > 0 && i % 10_000 == 0)
System.out.println("Done: " + i);
cache.put(i,new X12File("x12file" + i,LocalDateTime.now().toString()));
}
Thread.sleep(5000);
int matches = 0;
for (long i = 0; i < 4_000_000; i++) {
if (cache.get(i) != null)
++matches;
}
System.out.println("Matches: " + matches);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。