zoukankan      html  css  js  c++  java
  • 自己动手实现java中cache

    实现思路: 
    创建一个静态Hashtable用于保存key和value,对于cache过期后的方法回调,在cache过期后,再访问cache的时候进行,避免了使用定时器轮询过期时间,进行cache清除的效率损耗。 
    使用synchronized关键字进行多线程同步。 
    包括二个类和一个接口: 
    cache类:里面都是静态方法,提供基于key,value的方法进行cache的添加,修改,访问,进行cache过期后调用callback方法。 

    cacheitem类:用于管理每个条目的cache内容和超时时间回调方法 

    ICacheMethod接口:cache到期回调方法需要实现的接口 

    cache类:里面都是静态方法 

    import java.util.Date;
    
    public class Cache {
    
    	private static java.util.Hashtable<String, Object> __cacheList = new java.util.Hashtable<String, Object>();
    
    	public Cache() {
    
    	}
    
    	// 添加cache,不过期
    	public synchronized static void add(String key, Object value) {
    		Cache.add(key, value, -1);
    	}
    
    	// 添加cache有过期时间
    	public synchronized static void add(String key, Object value, long timeOut) {
    		Cache.add(key, value, timeOut, null);
    	}
    
    	// 添加cache有过期时间并且具有回调方法
    	public synchronized static void add(String key, Object value, long timeOut, ICacheMethod callback) {
    		if (timeOut > 0) {
    			timeOut += new Date().getTime();
    		}
    		CacheItem item = new CacheItem(key, value, timeOut, callback);
    		Cache.__cacheList.put(key, item);
    	}
    
    	// 获取cache
    	public synchronized static Object get(String key) {
    		Object obj = Cache.__cacheList.get(key);
    		if (obj == null) {
    			return null;
    		}
    		CacheItem item = (CacheItem) obj;
    		boolean expired = Cache.cacheExpired(key);
    		if (expired == true) // 已过期
    		{
    			if (item.getCallback() == null) {
    				Cache.remove(key);
    				return null;
    			} else {
    				ICacheMethod callback = item.getCallback();
    				callback.execute(key);
    				expired = Cache.cacheExpired(key);
    				if (expired == true) {
    					Cache.remove(key);
    					return null;
    				}
    			}
    		}
    		return item.getValue();
    	}
    
    	// 移除cache
    	public synchronized static void remove(String key) {
    		Object obj = Cache.__cacheList.get(key);
    		if (obj != null) {
    			obj = null;
    		}
    		Cache.__cacheList.remove(key);
    	}
    
    	// 清理所有cache对象
    	public synchronized static void clear() {
    
    		for (String s : Cache.__cacheList.keySet()) {
    			Cache.__cacheList.put(s, null);
    		}
    		Cache.__cacheList.clear();
    	}
    
    	// 判断是否过期
    	private static boolean cacheExpired(String key) {
    		CacheItem item = (CacheItem) Cache.__cacheList.get(key);
    		if (item == null) {
    			return false;
    		}
    		long milisNow = new Date().getTime();
    		long milisExpire = item.getTimeOut();
    		if (milisExpire <= 0) { // 不过期
    			return false;
    		} else if (milisNow >= milisExpire) {
    			return true;
    		} else {
    			return false;
    		}
    	}
    }
    

      

    public class CacheItem {
    
    	private String key;
    	private Object value;
    	private long timeOut;
    	private ICacheMethod callback = null;
    
    	public CacheItem() {
    
    	}
    
    	public ICacheMethod getCallback() {
    		return callback;
    	}
    
    	public void setCallback(ICacheMethod callback) {
    		this.callback = callback;
    	}
    
    	public CacheItem(String key, Object value) {
    		this.key = key;
    		this.value = value;
    		this.timeOut = 0;
    	}
    
    	public CacheItem(String key, Object value, long timeOut) {
    		this.key = key;
    		this.value = value;
    		this.timeOut = timeOut;
    	}
    
    	public CacheItem(String key, Object value, long timeOut, ICacheMethod callback) {
    		this.key = key;
    		this.value = value;
    		this.timeOut = timeOut;
    		this.callback = callback;
    	}
    
    	public String getKey() {
    		return key;
    	}
    
    	public void setKey(String key) {
    		this.key = key;
    	}
    
    	public Object getValue() {
    		return value;
    	}
    
    	public void setValue(Object value) {
    		this.value = value;
    	}
    
    	public long getTimeOut() {
    		return timeOut;
    	}
    
    	public void setTimeOut(long timeOut) {
    		this.timeOut = timeOut;
    	}
    }
    

      

    public interface ICacheMethod {
    	public void execute(String key); 
    }
    

      

  • 相关阅读:
    Codeforces Round #462 (Div. 2)
    Codeforces 934.D A Determined Cleanup
    Codeforces 934.C A Twisty Movement
    Codeforces 934.B A Prosperous Lot
    event和window.event
    javascript事件捕获与冒泡
    Dom兼容问题记录汇总
    流媒体网站开发技术浅谈
    javascript:自定义事件初探
    jQuery插件教程
  • 原文地址:https://www.cnblogs.com/firstdream/p/5515060.html
Copyright © 2011-2022 走看看