为了测试线上服务,加缓存的效果,模拟了一个本地缓存,去测试一下加缓存后的命中率,代码如下:
import java.util.Date;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 统计任务,统计一下缓存的命中率
*/
public class StatTask {
public static Log logger = LogFactory.getLog("stat-cache");
public static AtomicInteger total = new AtomicInteger(0);
public static AtomicInteger cachedNum = new AtomicInteger(0);
public static ConcurrentHashMap<String, AtomicInteger> buffer = new ConcurrentHashMap<String, AtomicInteger>();
public static Executor executor = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors() * 2);
public static void submit(final String url) {
executor.execute(new Runnable() {
@Override
public void run() {
try {
logger.info("link:" + url);
if (buffer.containsKey(url)) {
int num = buffer.get(url).incrementAndGet();
if (num % 10 == 0) {
logger.warn(String.format("url:%s be cached %d", url, num));
}
cachedNum.incrementAndGet();
} else {
buffer.put(url, new AtomicInteger());
}
total.incrementAndGet();
int cachedNumber = cachedNum.get();
int totalNum = total.get();
if (cachedNumber > 0 && cachedNumber % 100 == 0) {
logger.warn(String.format(
"cache hit %d and total:%d, 1.percentage of hits:%s", cachedNumber,
totalNum, cachedNumber / (1.0 * totalNum)));
}
} catch (Exception e) {
logger.error("统计cache命中率计数器出错:" + e.getMessage());
}
}
});
}
}