java缓存失效时间_java实现带过期时间的缓存

更新时间:2023-06-25 17:31:50 阅读: 评论:0

java缓存失效时间_java实现带过期时间的缓存private static ScheduledExecutorService swapExpiredPool
怀孕可以吃木瓜吗= new ScheduledThreadPoolExecutor(10);
private ReentrantLock lock = new ReentrantLock();
private ConcurrentHashMap cache = new ConcurrentHashMap<>(1024);
/**
* 让过期时间最⼩的数据排在队列前,在清除过期数据时
* ,只需查看缓存最近的过期数据,⽽不⽤扫描全部缓存
*
* @e Node#compareTo(Node)
* @e SwapExpiredNodeWork#run()
*/
private PriorityQueue expireQueue = new PriorityQueue<>(1024);
public LocalCache() {
自私基因
//使⽤默认的线程池,每5秒清除⼀次过期数据
//线程池和调⽤频率 最好是交给调⽤者去设置。
swapExpiredPool.scheduleWithFixedDelay(
new SwapExpiredNodeWork(), 5, 5, TimeUnit.SECONDS);
}
public Object t(String key, Object value, long ttl) {
Asrt.isTrue(StringUtils.hasLength(key), "key can't be empty");
Asrt.isTrue(ttl > 0, "ttl must greater than 0");
long expireTime = System.currentTimeMillis() + ttl;
Node newNode = new Node(key, value, expireTime);
lock.lock();
try {
Node old = cache.put(key, newNode);
expireQueue.add(newNode);
//如果该key存在数据,还要从过期时间队列删除
if (old != null) {
return old.value;申请报告格式范文
}
return null;
} finally {
lock.unlock();
}
}
/**
* 拿到的数据可能是已经过期的数据,可以再次判断⼀下
* pireTime
* return null;
* }
* 也可以直接返回整个节点Node ,交给调⽤者去取舍
*
氤氲的读音
*
* ⽆法判断不存在该key,还是该key存的是⼀个null值,如果需要区分这两种情况* 可以定义⼀个全局标识,标识key不存在
* public static final NOT_EXIST = new Object();
* 返回值时
* return n==null?NOT_EXIST:n.value;
*/
海棠花什么季节开花public Object get(String key) {
Node n = (key);
return n == null ? null : n.value;
}读书推荐卡
/**
* 删出KEY,并返回该key对应的数据
*/
public Object remove(String key) {
lock.lock();
try {
Node n = ve(key);
if (n == null) {
return null;
} el {
return n.value;
}
} finally {
lock.unlock();
}
带李的成语}
/**
去除水垢
* 删除已经过期的数据
*/
private class SwapExpiredNodeWork implements Runnable { @Override
public void run() {
long now = System.currentTimeMillis();
while (true) {
lock.lock();
try {
Node node = expireQueue.peek();
//没有数据了,或者数据都是没有过期的了
if (node == null || pireTime > now) {
return;
}
expireQueue.poll();
} finally {
lock.unlock();
}
}
}
}
private static class Node implements Comparable {
private String key;
private Object value;
private long expireTime;
public Node(String key, Object value, long expireTime) { this.value = value;
this.key = key;
}
/**
* @e SwapExpiredNodeWork
*/
@Override
public int compareTo(Node o) {
long r = pireTime - o.expireTime; if (r > 0) {
return 1;
}
if (r < 0) {
return -1;
}
return 0;
}
}

本文发布于:2023-06-25 17:31:50,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1037826.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   时间   缓存   标识   返回   过期数据   交给
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图