package com.negen;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* @author Negen
* @date 2022年7月28日20:25:47
* @description 缓存工具类
*/
public class CacheUtil {
/**
* 存储键值对
*/
private ConcurrentHashMap<String, Object> cacheMap = null;
/**
* 存储键值对的有效时间
*/
private ConcurrentHashMap<String, Long> expireMap = null;
/**
* 默认过期时间(毫秒 )
*/
private final long DEFAULT_EXPIRE_TIME = 1000 * 3600 * 24 * 30;
private static CacheUtil instance = null;
public static CacheUtil getInstance(){
if (null == instance){
synchronized (CacheUtil.class){
if (null == instance)instance = new CacheUtil();
}
}
return instance;
}
CacheUtil(){
cacheMap = new ConcurrentHashMap<>();
expireMap = new ConcurrentHashMap<>();
}
/**
* 添加键值对 默认失效时间30天
* @param key
* @param value
*/
public void put(String key, Object value){
this.put(key, value, DEFAULT_EXPIRE_TIME);
}
/**
* 添加键值对 自定义失效时间(毫秒)
* @param key
* @param value
* @param expire 有效期
*/
public void put(String key, Object value, long expire){
cacheMap.put(key, value);
expireMap.put(key, System.currentTimeMillis() + expire);
}
/**
* 根据 key 获取相应的 value
* @param key
* @return
*/
public Object get(String key){
return cacheMap.get(key);
}
/**
* 删除键值对
* @param key
* @return 被删除的键值对个数
*/
public int remove(String key){
int beforeRemoveCount = cacheMap.size();
cacheMap.remove(key);
expireMap.remove(key);
int afterRemoveCount = cacheMap.size();
return beforeRemoveCount - afterRemoveCount;
}
/**
* 处理已经过期的键值对
* @return
*/
public int handleExpireKeys(){
long now = System.currentTimeMillis();
int beforeRemoveCount = cacheMap.size();
List<Map.Entry<String, Long>> collect = expireMap.entrySet().stream()
.sorted((entry1, entry2) -> entry1.getValue().compareTo(entry2.getValue()))
.collect(Collectors.toList());
Iterator<Map.Entry<String, Long>> iterator = collect.iterator();
while (iterator.hasNext()){
Map.Entry<String, Long> kv = iterator.next();
String key = kv.getKey();
Long expireTime = kv.getValue();
if (expireTime < now){
this.remove(key);
System.out.println(String.format("%s过期,已删除", key));
}
}
int afterRemoveCount = cacheMap.size();
int removeCount = beforeRemoveCount - afterRemoveCount;
if (removeCount < 0)removeCount = 0;
System.out.println("当前过期键值对:" + removeCount);
return removeCount;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
java手写本地缓存示例
共14个文件
xml:5个
java:3个
pb:1个
需积分: 30 2 下载量 110 浏览量
2022-07-28
21:24:49
上传
评论
收藏 11KB ZIP 举报
温馨提示
基于java的map和timer实现本地缓存及定时清理失效缓存的功能 本项目仅用于初学者学习使用 初学者可基于此项目初步了解缓存实现的基本原理 后期在项目中使用建议使用现成的缓存框架:redis、ehcache等
资源详情
资源评论
资源推荐
收起资源包目录
ngtool.zip (14个子文件)
ngtool
ngtool
pom.xml 570B
src
test
java
TestCacheUtil.java 604B
main
resources
java
com
negen
CacheHandleSchedule.java 492B
CacheUtil.java 3KB
.idea
misc.xml 545B
jarRepositories.xml 1KB
compiler.xml 539B
sonarlint
issuestore
index.pb 325B
0
c
0c8fb1b9e3f52fc1d433c593d02301bc1a072eab 0B
6
4
64d7672deb08b358ab32918aadd01a5972e78589 0B
3
5
35c40ce0d36c201cad97152a655e7d00e75ce47f 519B
4
4
442292b8a7efeabbe4cc176709b833b1792140ec 0B
workspace.xml 3KB
.gitignore 50B
共 14 条
- 1
qq_36657751
- 粉丝: 1722
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0