public int calculateIpCount() {
int i = 0;
for (Map.Entry<Integer, Integer> entry : clientIpCache.asMap().entrySet()) {
if (clientIpCache.getIfPresent(entry.getKey()) != null) {
i++;
}
}
return i;
}
这里的clientIpCache是一个guava的loadingcache
很多人一看没理解这个代码在干嘛。
其实就是为了获取的loadingcache中没过期的key。
当时遍历所有的key去看一下是否过期,真的开销很大啊,经常缓存里会有几十万,甚至上百万的key。遍历一遍的开销真的很大。
那应该怎么做呢,其实很简单:
public int calculateIpCount() {
clientIpCache.cleanUp();
return Long.valueOf(clientIpCache.size()).intValue();
}
当然也会说,cleanUp看起来要删除所有的过期的对象,如果也是要遍历所有的key的话,那还不是一样的啊。

其实读写操作,都会进到读写的queue,从最早的开始遍历,在过期的key非常少的情况下,很快点遍历到没过期的对象,就停止了。是会好很多的。
网友评论