loadingCache比hashmap效率低。
看下这两个区别
// 存的是1 和TCoupon列表 一个map的结构
LoadingCache<Integer,List<TCoupon>> couponCache = CacheBuilder.newBuilder()
.expireAfterWrite(10,TimeUnit.MINUTES).refreshAfterWrite(5,TimeUnit.MINUTES)
.build(new CacheLoader<Integer, List<TCoupon>>() {
@Override
public List<TCoupon> load(Integer o) throws Exception {
return loadCoupon(o);
}
});
// 存的是id和 单个Tcoupon hashmap的结构
LoadingCache<Integer,TCoupon> couponIdsCache = CacheBuilder.newBuilder()
.expireAfterWrite(10,TimeUnit.MINUTES).refreshAfterWrite(5,TimeUnit.MINUTES)
.build(new CacheLoader<Integer,TCoupon>() {
@Override
public TCoupon load(Integer o) throws Exception {
return loadIdCoupon(o);
}
});
loadingCache集成了淘汰算法。可以优化储存。
-----------------------------------------------11-1-------------------------------------------------------------
LRU内存淘汰算法。
LRU:https://www.cnblogs.com/wyq178/p/9976815.html
基本原理:
双向链表有一个特点就是它的链表是双路的,我们定义好头节点和尾节点,然后利用先进先出(FIFO),最近被放入的数据会最早被获取。其中主要涉及到添加、访问、修改、删除操作。首先是添加,如果是新元素,直接放在链表头上面,其他的元素顺序往下移动;访问的话,在头节点的可以不用管,如果是在中间位置或者尾巴,就要将数据移动到头节点;修改操作也一样,修改原值之后,再将数据移动到头部;删除的话,直接删除,其他元素顺序移动;
-----------------------------------------------11-2-------------------------------------------------------------
实现:https://blog.csdn.net/qpzkobe/article/details/82318470
LFU:https://blog.csdn.net/u013164931/article/details/82803298
缺陷:尾部很可能被淘汰的。
-----------------------------------------------11-3-------------------------------------------------------------
来子未来的缓存Caffine介绍。
基于布隆过滤器:张三进来后,经过算法1,2,3,4去hash到进入到不同的槽位里面。并累加槽位的访问次数。每个槽位有一个计数器记录这个槽位被映射的次数。节省空间,槽位共用。所有映射道的最小的作为访问的频次。
计数器达到某个频次则全部/2。
-----------------------------------------------11-4-------------------------------------------------------------
代码:11.5
第一步:引入依赖
第二步:只改为caffie就可以了。
-----------------------------------------------11-5-------------------------------------------------------------
跑的结果:
对比:
GuavaCache:只是刷新和虚引用。
-----------------------------------------------11-6-------------------------------------------------------------
LRU:
package com.xdclass.couponapp;
import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K,V> extends LinkedHashMap<K,V> {
private int cacheSize;
public LRUCache(int cacheSize){
super(16,0.75f,true);
this.cacheSize = cacheSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
boolean r = size()>cacheSize;
if(r){
System.out.println("清除缓存key:" +eldest.getKey());
}
return r;
}
public static void main(String[] args) {
LRUCache<String,String> cache = new LRUCache<>(5);
cache.put("A","A");
cache.put("B","B");
cache.put("C","C");
cache.put("D","D");
cache.put("E","E");
System.out.println("初始化:"+cache.keySet());
System.out.println("访问值:"+cache.get("C"));
System.out.println("访问C后:"+cache.keySet());
System.out.println("访问值:"+cache.put("F","F"));
System.out.println("put F后:"+cache.keySet());
}
}
-----------------------------------------------11-7-------------------------------------------------------------