我在我的一个库中使用Guava缓存,并且该库正被我公司的其他一些服务(由其他团队管理)使用。我的图书馆每隔cache stats
次登录50000
。下面是我记录的输出
Cache Stats= CacheStats{hitCount=3296628, missCount=1353372, loadSuccessCount=1353138, loadExceptionCount=0, totalLoadTime=2268064327604, evictionCount=1325410}
Cache Stats= CacheStats{hitCount=3334167, missCount=1365834, loadSuccessCount=1365597, loadExceptionCount=0, totalLoadTime=2287551024797, evictionCount=1337740}
Cache Stats= CacheStats{hitCount=3371463, missCount=1378536, loadSuccessCount=1378296, loadExceptionCount=0, totalLoadTime=2309012047459, evictionCount=1350990}
Cache Stats= CacheStats{hitCount=3407719, missCount=1392280, loadSuccessCount=1392039, loadExceptionCount=0, totalLoadTime=2331355983194, evictionCount=1364535}
Cache Stats= CacheStats{hitCount=3443848, missCount=1406152, loadSuccessCount=1405908, loadExceptionCount=0, totalLoadTime=2354162371299, evictionCount=1378654}
我的缓存配置如下所示:
CacheBuilder
.newBuilder()
.maximumSize(1000000)
.expireAfterWrite(120, TimeUnit.SECONDS)
.concurrencyLevel(5000)
.removalListener(
RemovalListeners.asynchronous(new CustomListener(),
Executors.newSingleThreadScheduledExecutor())).build();
任何人都可以帮助我了解我们的命中率是多少以及如何解释上述缓存指标?我很困惑这些数字告诉我的是什么。根据以上结果,如果我们提高maximumSize
或expireAfterWrite
间隔,我们会看到更好的效果吗?
注意:我们仍在使用guava-11.0.2,因为某些原因我无法提升。
答案 0 :(得分:2)
来自文档..
缓存统计信息根据以下规则递增:
当缓存查找遇到现有缓存条目hitCount时 递增。
当缓存查找首次遇到丢失的缓存条目时,新的 条目已加载。
成功加载条目missCount和loadSuccessCount
递增,总加载时间(以纳秒为单位)
添加到totalLoadTime。
加载条目时抛出异常,missCount和 loadExceptionCount递增,总加载时间为 纳秒,添加到totalLoadTime。
遇到丢失的缓存条目的缓存查找仍然存在 加载将等待加载完成(无论是成功还是 不)然后增加missCount。
当一个条目从缓存中逐出时,evictionCount就是 递增。
当缓存条目无效或手动时,不会修改统计信息 除去。
在asMap视图中调用的操作不会修改任何统计信息 高速缓存
现在来看你的指标..
查看您的指标..
CacheStats{hitCount=3296628, missCount=1353372, loadSuccessCount=1353138, loadExceptionCount=0, totalLoadTime=2268064327604, evictionCount=1325410}
鉴于您的大小是1M,并且您的~75%请求正在获得缓存命中,并且您的数据大小最差情况大约为1.35M,并且您的缓存未命中看起来像是由于到期而发生。我建议将maximumSize
增加到大约1.25-1.35M并再次运行相同的测试。
如果您提及运行测试的时间范围,以便计算驱逐率,这也会有所帮助。如果可能,请将expireAfterWrite
时间增加到更高的数字,以减少驱逐次数。