线程安全的可控制最大容量且带有过期时间的本地缓存
最近在优化一个接口的时候打算使用一个key-value结构的本地缓存。
需要实现的功能非常简单:
1、可以控制本地缓存的最大对象数量。
2、线程安全,防止发生OOM。
3、同时支持设置单个对象的过期时间。
面对这个需求,选择很多,有很多框架都做的非常好,但大多数框架对我来说都太重量级了,我希望一个简单高效的实现,所以我开发了一个简单的小工具。
具体代码如下:
package com.zxwf.cache;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class LocalCache<T> {
public Map<String, Value> cache; // 缓存存放地址
private int maxNumber = 100; // 缓存最大个数 默认100
private int expire = -1; // 设置缓存的默认过期时间
private long lastUpdateTime; // 最后一次全量删除缓存时间
private AtomicInteger atomicInt = new AtomicInteger(0); // 计数器
public int maxNumberHis = 0; // 历史最高水位
public LocalCache(){
this.cache = new ConcurrentHashMap<>(maxNumber);
}
public LocalCache(int maxNumber, int expire){
// 设置缓存的过期时间
if(expire > 0){
this.expire = expire;
}
if(maxNumber <= 0){
throw new NegativeArraySizeException("The maximum number of caches must be greater than 0");
}
if(this.maxNumber != maxNumber){
this.maxNumber = maxNumber;
}
this.cache = new ConcurrentHashMap<>(maxNumber);
}
/**
* 清理过期缓存
* @return 返回清理缓存的个数
*/
protected int clearExpire(){
int clearCount = 0;
// 缓存不过期
if(this.expire <= 0){
return clearCount;
}
long current = System.currentTimeMillis();
try{
for (Map.Entry<String, Value> entry : cache.entrySet()) {
Value<T> val = entry.getValue();