概述
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();
}
}
}
posted on 2016-09-07 12:02 RockyLOMO 阅读(...) 评论(...) 编辑 收藏
最后
以上就是淡然丝袜为你收集整理的Java InMemoryCache的全部内容,希望文章能够帮你解决Java InMemoryCache所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复