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的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

随机推荐

  1. contiki-process_run()

    process_run()函数位于main函数中 ) { do { } ); idle_count++; } 找到函数的声明处: /** * Run the system once - call po ...

  2. 虚拟centos7 用ssh登录

    在虚拟机(Vmware Workstation)下,安装了CentOS7,现在想通过SSH工具连接虚拟机中的CentOS7 1.  首先,要确保CentOS7安装了  openssh-server,在 ...

  3. js 截取字符串,取指定位置的字符(完善中)

    1.获取字符串的最后一位或第一位 str.charAt(str.length - 1);    str.charAt(0);

  4. 【App测试】怎么测试启动时间?

    版权声明:本文由何小伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/687066001482481827 来源:腾云阁 h ...

  5. Java开源BI系统介绍(转)

    http://blog.csdn.net/boboo_2000_0/article/details/4810420 BI解决方案中的工具 一个完整的BI解决方案中有多种工具来完成BI系统中各个阶段的工 ...

  6. ssh用户登录

    1.搭建环境,连数据库,建包建类 2.Admin,这是表,表必须有主码 package com.chao.db; /** * Admin entity. @author MyEclipse Persi ...

  7. Codility Tree Height

    public class HeightOfTreeSolution { static int height=-1; public int solution(Tree T) { // write you ...

  8. Oracle 11g密码过期问题解决方案

    [问题描述]近日,使用sqlplus登陆短消息Oracle(Oracle培训 )数据库时提示“ORA-28000: 帐号被锁定”.[原因/触发因素]确定是由于oracle11g中默认在default概 ...

  9. How to run a geoprocessing tool

    How to run a geoprocessing tool In this topic Running a geoprocessing tool Toolbox names and namespa ...

  10. 元素操作(sizing,尺寸获取,设值,偏移算法,坐标算法)

    css3的Sizing Box-sizing是css3的box属性之一,遵循css的boxmodel原理,css中box model是分为两种,第一种是w3c的标准模型,另一种是ie的传统模型,他们相 ...