LRU算法是根据LinkedHashMap实现的
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* redis的lru算法实现
* lru算法是:删除最近最少使用,重点是使用最少
*/
//@Slf4j
public class LruUtils {
private static final Logger log = LoggerFactory.getLogger(LruUtils.class);
// Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
public Map<String, Integer> simple() {
int initialCapacity = 10;//初始化容量
float loadFactor = 0.75f;//加载因子,一般是 0.75f
boolean accessOrder = true;//排序方式 false 基于插入顺序 true 基于访问顺序
Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
for (int i = 0; i < 10; i++) {
map.put(String.valueOf(i), i);
}
//访问前顺序
for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Integer> next = it.next();
log.info("linkedMap--before-->" + next.getKey());
}
//模拟访问
map.get("5");
//访问后数据
for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Integer> next = it.next();
log.info("linkedMap--after-->" + next.getKey());
}
return map;
}
public static boolean lruUse() {
// final int initialCapacity = 10;//初始化容量
int initialCapacity = 16;//初始化容量
float loadFactor = 0.75f;//加载因子,一般是 0.75f
boolean accessOrder = true;//排序方式 false 基于插入顺序 true 基于访问顺序
//Map<String, Integer> map = new LinkedHashMap<>(initialCapacity, loadFactor, accessOrder);
Map<String, Integer> map = new LinkedHashMap(initialCapacity, loadFactor, accessOrder) {
private static final long serialVersionUID = -538572218634978920L;
@Override
protected boolean removeEldestEntry(Entry eldest) {
return size() > initialCapacity;
}
};
for (int i = 0; i < 20; i++) {
map.put(String.valueOf(i), i);
}
//访问前顺序
for (Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Integer> next = it.next();
log.info("linkedMap--before-->" + next.getKey());
}
return true;
}
public static void main(String[] args) {
lruUse();
}
}