可定制生命周期的缓存
1) ICache.java 缓存接口
1 package com.jgao.cache; 2 3 /** 4 * 缓存接口 5 * @author jgao 6 * 7 */ 8 public interface ICache { 9 10 public static int Forever = -1; //缓存中对象生命周期的结束标志 11 12 /** 13 * 判断缓存中的对象是否存在 14 * @param key 15 * @return 16 */ 17 boolean contains(String key); 18 19 /** 20 * 获取缓存中的对象 21 * @param key 对象名称 22 * @return 23 */ 24 Object get(String key); 25 26 /** 27 * 向缓存中插入对象 28 * @param key 对象名称 29 * @param obj 对象 30 * @param slidingExpiration 对象在缓存中存在的时间 31 */ 32 void Insert(String key, Object obj, int slidingExpiration); 33 34 /** 35 * 36 * 向缓存中添加对象,并返回该对象 37 * @param key 对象名称 38 * @param obj 对象 39 * @param slidingExpiration 对象在缓存中存在的时间 40 * @return 41 */ 42 Object Add(String key, Object obj, int slidingExpiration); 43 44 /** 45 * 移除缓存中的对象 46 * @param key 对象名称 47 * @return 48 */ 49 Object Remove(String key); 50 } 51 52 2) DefaultCache.java 默认缓存 53 54 package com.jgao.cache; 55 56 import java.util.*; 57 58 /** 59 * 系统默认的缓存 60 * @author jgao 61 * 62 */ 63 class DefaultCache implements ICache { 64 65 static int FreshTimerIntervalSeconds = 1; //缓存中对象生命周期的频率(一秒) 66 Map<String, SimpleCacheInfo> datas; //缓存容器 67 private Timer timer; //时间任务 68 69 /** 70 * 默认构造函数 71 * 72 */ 73 public DefaultCache() { 74 //实例化有防止线程同步操作的缓存容器 75 datas = Collections.synchronizedMap(new HashMap<String, SimpleCacheInfo>()); 76 77 //刷新缓存 78 TimerTask task = new CacheFreshTask(this); 79 timer = new Timer("SimpleCache_Timer", true); 80 timer.scheduleAtFixedRate(task, 1000, FreshTimerIntervalSeconds * 1000);//每格一秒刷新一次(缓存中对象的生命周期减一) 81 } 82 83 /** 84 * 判断缓存中的对象是否存在 85 * @param key 86 * @return 87 */ 88 public boolean contains(String key){ 89 return datas.containsKey(key); 90 } 91 92 /** 93 * 获取缓存中的对象 94 * @param key 对象名称 95 * @return 96 */ 97 public Object get(String key) { 98 if (datas.containsKey(key)) { 99 SimpleCacheInfo sci = (SimpleCacheInfo)datas.get(key); 100 //sci.setSecondsRemain(sci.getSecondsTotal()); 101 return sci.getObj(); 102 } 103 return null; 104 } 105 106 /** 107 * 向缓存中插入对象 108 * @param key 对象名称 109 * @param obj 对象 110 * @param cacheSeconds 对象在缓存中存在的时间 111 */ 112 public void Insert(String key, Object obj, int cacheSeconds) { 113 Add(key, obj, cacheSeconds); 114 } 115 116 /** 117 * 118 * 向缓存中添加对象,并返回该对象 119 * @param key 对象名称 120 * @param obj 对象 121 * @param cacheSeconds 对象在缓存中存在的时间 122 * @return 123 */ 124 public Object Add(String key, Object obj, int cacheSeconds) { 125 if (cacheSeconds != 0) { 126 SimpleCacheInfo sci = new SimpleCacheInfo(obj, cacheSeconds); 127 datas.put(key, sci); 128 } 129 return obj; 130 } 131 132 /** 133 * 移除缓存中的对象 134 * @param key 对象名称 135 * @return 136 */ 137 public Object Remove(String key) { 138 SimpleCacheInfo sci = datas.remove(key); 139 if (sci != null) { 140 return sci.getObj(); 141 } 142 return null; 143 } 144 145 /** 146 * 缓存信息类(存储缓存中的对象和缓存时间) 147 * @author jgao 148 * 149 */ 150 class SimpleCacheInfo { 151 private Object obj; 152 private int secondsRemain; 153 private int cacheSeconds; 154 155 public SimpleCacheInfo(Object obj, int cacheSeconds) { 156 this.obj = obj; 157 this.secondsRemain = cacheSeconds; 158 this.cacheSeconds = cacheSeconds; 159 } 160 161 public Object getObj() { 162 return obj; 163 } 164 165 int getSecondsTotal() { 166 return cacheSeconds; 167 } 168 169 int getSecondsRemain() { 170 return secondsRemain; 171 } 172 173 void setSecondsRemain(int value) { 174 secondsRemain = value; 175 } 176 } 177 178 /** 179 * 管理缓存中对象的生命周期的任务类(用于定时刷新缓存中的对象) 180 * @author jgao 181 * 182 */ 183 class CacheFreshTask extends TimerTask { 184 private DefaultCache cache; 185 public CacheFreshTask(DefaultCache cache) { 186 this.cache = cache; 187 } 188 189 public void run() { 190 synchronized (cache.datas) { 191 Iterator<Map.Entry<String, SimpleCacheInfo>> iterator 192 = cache.datas.entrySet().iterator(); 193 while (iterator.hasNext()) { 194 Map.Entry<String, SimpleCacheInfo> entry = iterator.next(); 195 SimpleCacheInfo sci = entry.getValue(); 196 if (sci.getSecondsTotal() != ICache.Forever) { 197 sci.setSecondsRemain(sci.getSecondsRemain() - FreshTimerIntervalSeconds); 198 if (sci.getSecondsRemain() <= 0) { 199 iterator.remove(); 200 } 201 } 202 } 203 } 204 } 205 } 206 } 207 208 209 3) CacheFactory.java 缓存工厂 210 211 package com.jgao.cache; 212 213 /** 214 * 缓存工厂,用于获取和制造缓存 215 * @author jgao 216 * 217 */ 218 public class CacheFactory { 219 220 private static ICache cache = null; 221 222 /** 223 * 获取caches指定的缓存 224 * @param caches 225 * @return 226 */ 227 public static ICache getCacheInstance(Class caches){ 228 if(cache==null){ 229 try { 230 cache = (ICache) caches.newInstance(); 231 } catch (InstantiationException e) { 232 System.out.println("指定的缓存类有误,caches参数必须是ICache的实现类"); 233 e.printStackTrace(); 234 } catch (IllegalAccessException e) { 235 System.out.println("指定的缓存类有误,caches参数必须是ICache的实现类"); 236 e.printStackTrace(); 237 } 238 } 239 return cache; 240 } 241 242 /** 243 * 获取系统默认的缓存 244 * @return 245 */ 246 public static ICache getDefaultCache(){ 247 if(cache==null){ 248 cache = new DefaultCache(); 249 }else if(!(cache instanceof DefaultCache)){ 250 cache = new DefaultCache(); 251 } 252 return cache; 253 } 254 255 public static void main(String[] args) { 256 ICache cache = CacheFactory.getDefaultCache(); 257 if(cache.contains("area")){ 258 System.out.println(cache.get("area")); 259 }else{ 260 cache.Insert("area","福州",120); 261 } 262 263 } 264 }
原帖地址:http://www.blogjava.net/jgao/archive/2007/04/22/112541.html