Java InMemoryCache
package pay.infrastructure.helper; import org.apache.commons.collections.MapIterator;
import org.apache.commons.collections.map.LRUMap; import java.util.ArrayList; /**
* Created by wangxiaoming on 2016/3/14.
*/
public class InMemoryCache<TK, TV> {
protected class CrunchifyCacheObject {
public long lastAccessed;
public TV value; protected CrunchifyCacheObject(TV value) {
lastAccessed = System.currentTimeMillis();
this.value = value;
}
} private long timeToLive;
private LRUMap crunchifyCacheMap; public InMemoryCache(long crunchifyTimeToLive, final long crunchifyTimerInterval, int maxItems) {
crunchifyCacheMap = new LRUMap(maxItems);
this.timeToLive = crunchifyTimeToLive * 1000; if (timeToLive > 0 && crunchifyTimerInterval > 0) {
Thread t = new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(crunchifyTimerInterval * 1000);
} catch (InterruptedException ex) {
}
cleanup();
}
}
});
t.setDaemon(true);
t.start();
}
} public void put(TK key, TV value) {
synchronized (crunchifyCacheMap) {
crunchifyCacheMap.put(key, new CrunchifyCacheObject(value));
}
} @SuppressWarnings("unchecked")
public TV get(TK key) {
synchronized (crunchifyCacheMap) {
CrunchifyCacheObject c = (CrunchifyCacheObject) crunchifyCacheMap.get(key); if (c == null) {
return null;
} else {
c.lastAccessed = System.currentTimeMillis();
return c.value;
}
}
} public void remove(TK key) {
synchronized (crunchifyCacheMap) {
crunchifyCacheMap.remove(key);
}
} public int size() {
synchronized (crunchifyCacheMap) {
return crunchifyCacheMap.size();
}
} @SuppressWarnings("unchecked")
public void cleanup() {
long now = System.currentTimeMillis();
ArrayList<TK> deleteKey = null; synchronized (crunchifyCacheMap) {
MapIterator itr = crunchifyCacheMap.mapIterator();
deleteKey = new ArrayList<>((crunchifyCacheMap.size() / 2) + 1); while (itr.hasNext()) {
TK key = (TK) itr.next();
CrunchifyCacheObject c = (CrunchifyCacheObject) itr.getValue(); if (c != null && (now > (timeToLive + c.lastAccessed))) {
deleteKey.add(key);
}
}
} for (TK key : deleteKey) {
synchronized (crunchifyCacheMap) {
crunchifyCacheMap.remove(key);
}
Thread.yield();
}
}
}
Java InMemoryCache的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- Java多线程基础学习(二)
9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...
- Java多线程基础学习(一)
1. 创建线程 1.1 通过构造函数:public Thread(Runnable target, String name){} 或:public Thread(Runnable target ...
随机推荐
- AWT编程学习01(未完成)
本文资料来源:<java疯狂讲义> 作者:李刚 终于要学习这一部分了~~虽然很多人(明明是绝大多数的人)说学这个没有用...而且有点过时了...但我觉得很有意思啊...感兴趣就学~~反正多 ...
- 百川即时通讯跨appkey问题解决
当前调用的sdk版本为: <script src="https://g.alicdn.com/aliww/??h5.openim.sdk/1.0.6/scripts/wsdk.js,h ...
- test 2017-1-5
// dpm(drupal_get_filename('module','devel'));// sites/all/modules/contrib/dev/devel/devel.mod ...
- iBATIS代码生成分析
1.分析目录结构"tools"(或者说模板) 2.首先分析ibatorConfig.xml文件 <?xml version="1.0" encoding= ...
- express+gulp构建项目(一)项目目录结构
express是基于nodejs平台的web框架,它可以让我们快速开发出web引用.而gulp是一种自动构建工具,非常强大,有了它,能帮我们完成很多繁琐的工作,例如,静态文件的压缩,为静态文件加上哈希 ...
- for语句嵌套循坏性能的剖析
日常工作中,处理数据难免会遇到遍历,for循环可能是我们用的比较多的了.本节就来探讨下for语句嵌套循环的性能,猜想下面两个语句的性能. 语句1 ; i < ; i++){ ; j < ; ...
- vi编辑器 使用 命令
vi编辑器 1)命令模式 打开文件后.默认处于命令模式,命令模式无法编辑文件 2)输入模式 在命令模式下 按 i 进入输入模式,便于编辑文件内容 3)末行模式 编辑内容后,按esc进入到命令模式,再按 ...
- MySQL全文检索
参考一:http://www.cnblogs.com/feichexia/archive/2012/06/09/2543049.html
- C#验证码的生成
HTML <ul> <li>验证码:</li> <li> <img src="/Login/GetValidateCode?ID=1&q ...
- [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例
懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...