2

例如,我通过以下方式配置缓存:

public IgniteCache<String, Object> getOrCreateCache(String cacheName) {
    Ignite ignite = Ignition.ignite();

    CacheConfiguration<String, Object> cacheCfg = new CacheConfiguration<String, Object>(cacheName);
    cacheCfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.SECONDS, 30)));

    IgniteCache<String, Object> igniteCache = ignite.getOrCreateCache(cacheCfg);
    return igniteCache;     
}

现在,如果稍后我想从返回的 igniteCache 中找出过期策略的持续时间怎么办。我可以通过以下 hacky 方式做到这一点,但它很丑陋,而且不可能是正确的方式:

import javax.cache.configuration.Factory;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;

import org.apache.ignite.IgniteCache;
import org.apache.ignite.configuration.CacheConfiguration;

public class IgniteCacheManager {

    private IgniteCache<String, Object> igniteCache;

    public IgniteCacheManager(IgniteCache<String, Object> igniteCache) {
        this.igniteCache = igniteCache;
    }

    public long getTimeToLive() {
        long timeToLive = 0;
        CacheConfiguration configuration = igniteCache.getConfiguration(CacheConfiguration.class);
        Factory factory = configuration.getExpiryPolicyFactory();
        Object obj = factory.create();
        if (obj instanceof CreatedExpiryPolicy) {
            CreatedExpiryPolicy cep = (CreatedExpiryPolicy)obj;
            Duration dur = cep.getExpiryForCreation();
            timeToLive = dur.getDurationAmount();
        }
        return timeToLive;
    }
}

我正在使用的 Apache Ignite 版本是 1.5.0.final

顺便说一句,在 Ehcache 中,我可以通过以下方式简单地获取配置:

import net.sf.ehcache.Cache;
import net.sf.ehcache.config.CacheConfiguration;

public class EhcacheCacheManager {

    private Cache cache;

    public EhcacheCacheManager(Cache cache) {
        this.cache = cache;
    }

    public long getTimeToLive() {
        long timeToLive = 0;

        CacheConfiguration config = cache.getCacheConfiguration();
        timeToLive = config.getTimeToLiveSeconds();
        return timeToLive;
    }
}
4

2 回答 2

2

按照 dmagda 的建议(欢呼声),我联系了 Ignite 社区。正如Apache Ignite 用户论坛的 AndreyVel 所建议的那样,目前我们可以在没有黑客攻击的情况下获得 ExpiryPolicy:

import javax.cache.configuration.Factory;
import javax.cache.expiry.ExpiryPolicy;

import org.apache.ignite.IgniteCache;
import org.apache.ignite.configuration.CacheConfiguration;

public class IgniteCacheManager {

    private IgniteCache<String, Object> igniteCache;

    public IgniteCacheManager(IgniteCache<String, Object> igniteCache) {
        this.igniteCache = igniteCache;
    }

    public long getTimeToLive() {
        CacheConfiguration configuration = igniteCache.getConfiguration(CacheConfiguration.class);
        Factory factory = configuration.getExpiryPolicyFactory();
        ExpiryPolicy policy = factory.create(); 
        long timeToLive = policy.getExpiryForCreation().getDurationAmount();
        return timeToLive;
    }
}

论坛上还有来自 alexey.goncharuk 的评论,他同意这种方式有点尴尬,它只涵盖配置的 ExpiryPolicy,目前无法检查 IgniteCache 的实例是否是使用 withExpiryPolicy() 方法创建的。

他认为在 IgniteCache 上添加 getExpiryPolicy() 应该没问题,如果这是默认缓存实例,它将返回配置的过期策略(可能为 null),如果使用 withExpiryPolicy() 创建缓存实例,则返回用户指定的过期策略。

将此交叉发布到 Ignite 开发人员列表,以了解开发人员社区的想法。

于 2016-06-29T16:25:10.807 回答
2

目前我没有看到任何其他方法可以使用公共 API 获取缓存条目的 TTL 值。但是,如果存在这样的辅助方法,很可能它会以与您类似的方式实现,但它只会计算 TTL 一次,为后续方法的调用返回相同的值。

所以你可以通过只计算一次 TTL 来简单地改进你的代码,它会变得更加优化。您也可以随时联系 Ignite 社区,提议向公共 API 添加类似的方法。

于 2016-05-21T07:54:59.800 回答