模拟一个本地缓存,统计缓存的命中率
为了测试线上服务,加缓存的效果,模拟了一个本地缓存,去测试一下加缓存后的命中率,代码如下:
?
?
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()); } } }); }}