Guava Cache的缓存统计

guava cache很适合做进程内的缓存,本文先学习下它的缓存统计功能,需要使用recordStats()打开缓存统计功能。

// 创建1块缓存,key和value都是integer类型,最大缓存个数是5,开启缓存统计功能
        // 使用LoadingCache,如果数据不存在就使用CacheLoader加载数据
        LoadingCache cache = CacheBuilder.newBuilder().recordStats().maximumSize(5).
                build(new CacheLoader<Integer, Integer>() {
                    @Override
                    public Integer load(Integer id) throws Exception {
                        System.out.println("mock query db....");
                        if (id % 2 == 0) {
                            Thread.sleep(100);
                            throw new RuntimeException();
                        } else {
                            Thread.sleep(200);
                            return id * 10;
                        }
                    }
                });


CacheStats的javadoc已经很清楚地描述了缓存统计的一些规则:



// 预先添加一条缓存数据
cache.put(1, 100);
System.out.println("...." + cache.stats());

// 缓存命中,hitCount加1
System.out.println("get data====" + cache.get(1));
System.out.println("...." + cache.stats());

// 没有命中缓存, missCount和loadSuccessCount加1,并增加totalLoadTime(纳秒为单位)
System.out.println("get data====" + cache.get(3));
System.out.println("...." + cache.stats());

// 没有命中缓存, missCount和loadExceptionCount加1,并增加totalLoadTime(纳秒为单位)
try {
	System.out.println("get data====" + cache.get(4));
} catch (Exception e) {
	System.out.println("...." + cache.stats());
}

// 手动清除缓存数据,或者是直接操作缓存底层数据,不会影响统计信息
System.out.println("get data====" + cache.asMap().get(1));// 通过缓存底层数据结构,读取数据
cache.invalidateAll();// 清空缓存
System.out.println("...." + cache.stats());

// 添加6条缓存数据,由于最大数目是5,所以evictionCount=1
System.out.println("size===" + cache.size());
cache.put(1, 100);
cache.put(2, 100);
cache.put(3, 100);
cache.put(4, 100);
cache.put(5, 100);
cache.put(6, 100);
System.out.println("...." + cache.stats());



有一点需要注意下:可以通过修改底层map给缓存添加数据,也可以获取数据。通过map获取数据,不会影响缓存统计;通过map添加数据,会影响evictionCount。

// 创建1块缓存,key和value都是integer类型,最大缓存个数是5,开启缓存统计功能
// 使用LoadingCache,如果数据不存在就使用CacheLoader加载数据
LoadingCache cache = CacheBuilder.newBuilder().recordStats().maximumSize(5).
		build(new CacheLoader<Integer, Integer>() {
			@Override
			public Integer load(Integer id) throws Exception {
				System.out.println("mock query db....");
				if (id % 2 == 0) {
					Thread.sleep(100);
					throw new RuntimeException();
				} else {
					Thread.sleep(200);
					return id * 10;
				}
			}
		});

// 修改底层的map也会导致cache发生变化
ConcurrentMap underlingMap = cache.asMap();
underlingMap.put(1, 1);
underlingMap.put(2, 2);
underlingMap.put(3, 3);
underlingMap.put(4, 4);
underlingMap.put(5, 5);
underlingMap.put(6, 6);

System.out.println("underlingMap...." + underlingMap);
System.out.println("cache...." + cache.size());

// evictionCount=1
System.out.println("stats...." + cache.stats());




发布了335 篇原创文章 · 获赞 192 · 访问量 196万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章