基于DelayQueue实现的带失效时间的缓存
时间:2022-07-24
本文章向大家介绍基于DelayQueue实现的带失效时间的缓存,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
import java.util.concurrent.DelayQueue;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Auther: ZhangShenao
* @Date: 2019/2/27 18:38
* @Description:缓存实现,可自动移除过期的缓存项
*/
public class ScheduledCache<K, V> {
private final DelayQueue<CacheItem<K, V>> cache = new DelayQueue<>();
private final int capacity;
private AtomicInteger size;
private volatile boolean valid;
public ScheduledCache(int capacity) {
this.capacity = capacity;
size = new AtomicInteger(0);
valid = true;
startCheckTask();
}
public void put(K key, V value, long timeout) {
CacheItem item = new CacheItem();
item.setKey(key);
item.setValue(value);
item.setExpireTimeMillis(System.currentTimeMillis() + timeout);
cache.put(item);
size.incrementAndGet();
System.err.println(String.format("添加缓存项。key: %s, value: %s。", item.getKey(), item.getValue()));
}
public void evict(){
size.compareAndSet(size.get(),0);
valid = false;
cache.clear();
}
private class CheckExpiredItemTask implements Runnable {
@Override
public void run() {
while (valid) {
try {
expire(cache.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private void startCheckTask(){
new Thread(new CheckExpiredItemTask()).start();
}
private void expire(CacheItem item) {
size.decrementAndGet();
System.err.println(String.format("缓存项已过期!key: %s, value: %s, 缓存剩余项数量: %s。", item.getKey(), item.getValue(), size.get()));
}
}
import lombok.Getter;
import lombok.Setter;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
/**
* @Auther: ZhangShenao
* @Date: 2019/2/27 18:34
* @Description:缓存项
*/
@Getter
@Setter
public class CacheItem<K,V> implements Delayed{
private K key;
private V value;
private long expireTimeMillis;
@Override
public long getDelay(TimeUnit unit) {
return expireTimeMillis - System.currentTimeMillis();
}
@Override
public int compareTo(Delayed o) {
CacheItem item = (CacheItem)o;
return (expireTimeMillis > item.expireTimeMillis ? 1 : 0);
}
}
- 代码实现 WordPress 反垃圾评论功能
- Flash/Flex学习笔记(39):弹性运动
- 兼容Mono的下一代云环境Web开发框架ASP.NET vNext
- ASP.NET vNext 概述
- 丰富排版页面——为你的wordpress主题添加短代码形式美化框
- 开放式管理基础结构 OMI
- 人类设计了游戏和AI 2017年AI在游戏中打败了人类
- WordPress 代码实现相关文章(列表模式)功能
- 自动刷新页面
- Python语言被列入全国计算机等级考试科目中
- WordPress纯代码高仿 无觅相关文章 图文模式功能
- 各种序列化库的性能数据
- WordPress内置搜索结果只有一篇文章时自动跳转到该文章
- Flash/Flex学习笔记(23):运动学原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 疯子的算法总结(六) 简单排序总 选择排序+插入排序+比较排序+冒泡排序
- C语言基础知识总结
- CF思维联系--CodeForces - 218C E - Ice Skating (并查集)
- 数组及字符串相关知识
- C++循环结构
- C++条件分支结构
- USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
- 数学--数论--HDU--5878 Count Two Three 2016 ACM/ICPC Asia Regional Qingdao Online 1001
- ACM-ICPC 2019 山东省省赛D Game on a Graph
- 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
- 数学--数论--Alice and Bob (CodeForces - 346A )推导
- ACM-ICPC 2019 山东省省赛 M Sekiro
- 数学--数论--HDU2136 Largest prime factor 线性筛法变形
- ACM-ICPC 2019 山东省省赛 C Wandering Robot
- 数据库SQL语言从入门到精通--Part 2--MySQL安装