如何获取Ehcache中的对象数量?

时间:2018-01-17 14:24:09

标签: java ehcache

我正在使用Ehcache 2.10.4。我使用枚举来配置我的缓存:

FAILED_MESSAGES_REPLAY_COUNTS(" msgreplaycount",50000,false,0,3600)

private TmaticInMemoryCache(String name, int maxElementsInMemory, boolean eternal, int timeToLiveSeconds, int timeToIdleSeconds) {
    this.cacheName = name;
    CacheManager cm = CacheManager.getInstance();
    if (!cm.cacheExists(name)) {// overflowtoDisk is always false
        cm.addCache(new Cache(name, maxElementsInMemory, false, eternal, timeToLiveSeconds, timeToIdleSeconds));
        this.theCache = cm.getCache(this.cacheName);
    }
}

但是当我检查尺寸时,它似乎永远不会驱逐/过期。

public static String cacheStats() {
    StringBuilder sb = new StringBuilder("Storm in memory caches:");
    for (int i = 0; i < TmaticInMemoryCache.values().length; i++) {
        TmaticInMemoryCache tmaticCache = TmaticInMemoryCache.values()[i];
        sb.append("\n  *  ").append(tmaticCache.name()).append(":");
        Cache c = tmaticCache.getCache();
        StatisticsGateway statistics = c.getStatistics();
        long hits = statistics.cacheHitCount();
        long misses = statistics.cacheMissCount();
        long size = statistics.getSize();
        long expired = statistics.cacheExpiredCount();
        long evicted = statistics.cacheEvictedCount();
        sb.append(String.format("(hits/misses: %d/%d, expired/evicted: %d/%d, current size: %d)", hits, misses, expired, evicted, size));
    }
    return sb.toString();
}

所以这是几天没有运行(jvm空闲)后的结果。 Ehcache报告缓存中仍有317个项目,但没有任何项目过期。

FAILED_MESSAGES_REPLAY_COUNTS:(hits/misses: 4/13665103, expired/evicted: 0/0, current size: 317)

这些项目只能在缓存中停留300秒,但它们似乎永远存在。

2 个答案:

答案 0 :(得分:2)

  • 您的设置使用TTI而不是TTL,这意味着每次您点击一个条目时,其到期时间都会被配置的数量推迟。
  • 根据底部打印的统计数据,与未命中相比,您的命中率非常低。这意味着你几乎从未从缓存中读取值
  • Ehcache没有急切的过期机制。缓存中的过期条目将保留在那里,直到它们被请求(并因此被清理)或者直到缓存已满并驱逐为止。

从这些观点来看,你看到的数字是有意义的:你点击的几个条目看到他们的生命延长,其他条目只是坐在那里,现在很可能无效但从未清理过,驱逐不是问题,因为你是低于容量的方式。

最后,你回答自己的问题,因为你可以显示缓存中的元素数量。

答案 1 :(得分:0)

public int noOfCacheObject(String cacheName) {
    Ehcache cache = cacheManager.getEhcache(cacheName);

    if (cache == null) {
        return 0;
    }

    return cache.getKeys().size();
}