Java-ConcurrentHashMap实现缓存、异步
MyCache.java
package cn.pangpython.test.cache;
/**
* Created by pangPython on 2017/9/25.
*
* 缓存实体类
*/
public class MyCache {
private String sessionID;
private Object cacheObj;
private long lastAccessTime;
public MyCache(String sessionID, Object cacheObj) {
this.sessionID = sessionID;
this.cacheObj = cacheObj;
}
public MyCache(String sessionID, Object cacheObj, long lastAccessTime) {
this.sessionID = sessionID;
this.cacheObj = cacheObj;
this.lastAccessTime = lastAccessTime;
}
public String getSessionID() {
return sessionID;
}
public void setSessionID(String sessionID) {
this.sessionID = sessionID;
}
public Object getCacheObj() {
return cacheObj;
}
public void setCacheObj(Object cacheObj) {
this.cacheObj = cacheObj;
}
public long getLastAccessTime() {
return lastAccessTime;
}
public void setLastAccessTime(long lastAccessTime) {
this.lastAccessTime = lastAccessTime;
}
}
CacheManager.java
package cn.pangpython.test.cache;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by pangPython on 2017/9/25.
*/
public class CacheManager {
private ConcurrentHashMap<String,MyCache> cacheContainer = null;
private static volatile CacheManager m_cacheManager = null;
private long timeout;
public static CacheManager getInstance() {
if(m_cacheManager == null){
synchronized (CacheManager.class){
if(m_cacheManager == null){
m_cacheManager = new CacheManager(1000*60*30);
}
}
}
return m_cacheManager;
}
private CacheManager(long timeout) {
this.timeout = timeout;
cacheContainer = new ConcurrentHashMap<>();
CacheCleaner cacheCleanerThread = new CacheCleaner();
cacheCleanerThread.start();
}
/**
* 访问缓存
* 每一次访问把最后访问时间改成当前时间
*
* @param key
* @return
*/
public MyCache getCache(String key){
MyCache myCache = cacheContainer.get(key);
myCache.setLastAccessTime(System.currentTimeMillis());
cacheContainer.put(key,myCache);
return myCache;
}
/**
* 添加缓存
*
* 默认最后访问时间为当期时间
* @param key
* @param value
*/
public void setCache(String key,MyCache value){
MyCache myCache = new MyCache(key,value.getCacheObj());
myCache.setLastAccessTime(System.currentTimeMillis());
cacheContainer.put(key,myCache);
}
/**
* 缓存定时清理线程
*
*/
class CacheCleaner extends Thread{
@Override
public void run() {
while(true){
/**
* 30分钟执行一次清理
*
*/
try {
Thread.sleep(1000*60*30);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (Map.Entry<String,MyCache> entry:cacheContainer.entrySet() ) {
String sessionID = entry.getKey();
MyCache myCache = entry.getValue();
if(System.currentTimeMillis() - myCache.getLastAccessTime() >= timeout){
cacheContainer.remove(sessionID);
}
}
}
}
}
}
CacheTest.java
package cn.pangpython.test.cache;
import java.util.Random;
/**
* Created by pangPython on 2017/9/25.
*/
public class CacheTest {
public static void main(String[] args){
/**
* 比较好的使用场景就是:网络请求的状态下,请求过来,直接返回,然后开启线程操作,修改结果集,供上层轮询调用,实现异步。
*
*/
CacheManager cacheManager = CacheManager.getInstance();
String sessionID = "test_sessionid";
Integer random_num = new Random().nextInt();
System.out.println(random_num);
MyCache myCache = new MyCache(sessionID,random_num);
cacheManager.setCache(sessionID,myCache);
try {
Thread.sleep(1000*3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cacheManager.getCache(sessionID).getCacheObj().toString());
}
}