如何获取 Ehcache 中的对象数?
How do I get the number of objects in an Ehcache?
我正在使用 Ehcache 2.10.4。我使用枚举像这样配置我的缓存:
FAILED_MESSAGES_REPLAY_COUNTS("msgreplaycount", 50000, 假, 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);
}
}
但是当我检查尺寸时,它似乎从来没有 evict/expire 任何东西。
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 秒,但它们似乎会永远保留。
- 您的设置使用 TTI 而不是 TTL,这意味着每次您点击一个条目时,它的到期时间都会推迟配置的时间。
- 从底部打印的统计数据来看,与未命中率相比,您的命中率非常低。这意味着您几乎从不从缓存中读取值
- Ehcache 没有急切的过期机制。缓存中的过期条目将保留在那里,直到它们被请求(并因此被清理)或直到缓存已满并开始逐出。
从这些点来看,您看到的数字是有道理的:您点击的少数条目的生命周期得到延长,其他条目只是坐在那里,现在很可能无效但从未清理过,驱逐不是问题,因为你远远低于容量。
最后,您自己回答问题,因为您可以显示缓存中的元素数量。
public int noOfCacheObject(String cacheName) {
Ehcache cache = cacheManager.getEhcache(cacheName);
if (cache == null) {
return 0;
}
return cache.getKeys().size();
}
我正在使用 Ehcache 2.10.4。我使用枚举像这样配置我的缓存:
FAILED_MESSAGES_REPLAY_COUNTS("msgreplaycount", 50000, 假, 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);
}
}
但是当我检查尺寸时,它似乎从来没有 evict/expire 任何东西。
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 秒,但它们似乎会永远保留。
- 您的设置使用 TTI 而不是 TTL,这意味着每次您点击一个条目时,它的到期时间都会推迟配置的时间。
- 从底部打印的统计数据来看,与未命中率相比,您的命中率非常低。这意味着您几乎从不从缓存中读取值
- Ehcache 没有急切的过期机制。缓存中的过期条目将保留在那里,直到它们被请求(并因此被清理)或直到缓存已满并开始逐出。
从这些点来看,您看到的数字是有道理的:您点击的少数条目的生命周期得到延长,其他条目只是坐在那里,现在很可能无效但从未清理过,驱逐不是问题,因为你远远低于容量。
最后,您自己回答问题,因为您可以显示缓存中的元素数量。
public int noOfCacheObject(String cacheName) {
Ehcache cache = cacheManager.getEhcache(cacheName);
if (cache == null) {
return 0;
}
return cache.getKeys().size();
}