首先 我們 先寫兩個類,一個是Cache(緩衝類)和另外一個CacheManager(緩衝管理類)
1 Cache類
package com.yhsx.service.impl;/** * Created by dhb on 2016/6/24. */public class Cache { private String key;//緩衝ID private Object value;//快取資料 private long timeOut;//更新時間 private boolean expired; //是否終止 public Cache() { super(); setTimeOut(System.currentTimeMillis() + 1000 * 60 * 60 * 24); setExpired(false); } public Cache(String key, Object value, long timeOut, boolean expired) { this.key = key; this.value = value; this.timeOut = timeOut; this.expired = expired; } public String getKey() { return key; } public long getTimeOut() { return timeOut; } public Object getValue() { return value; } public void setKey(String string) { key = string; } public void setTimeOut(long l) { timeOut = l; } public void setValue(Object object) { value = object; } public boolean isExpired() { return expired; } public void setExpired(boolean b) { expired = b; }}
2CacheManager
package com.yhsx.service.impl;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;/** * Created by guanxin on 2016/6/24. */public class CacheManager { //key唯一名稱 public static final String strFormDict = "formDictformMain"; /************************************************後台 緩衝 ********************************************************/ public static final String findAllEstate="findAllEstate";//所有房地產資訊 /************************************************後台 緩衝 end********************************************************/ private static HashMap cacheMap = new HashMap(); //單一實例構造方法 private CacheManager() { super(); } //擷取布爾值的緩衝 public static boolean getSimpleFlag(String key){ try{ return (Boolean) cacheMap.get(key); }catch(NullPointerException e){ } return false; } public static long getServerStartdt(String key){ try { return (Long)cacheMap.get(key); } catch (Exception ex) { return 0; } } //設定布爾值的緩衝 public synchronized static boolean setSimpleFlag(String key,boolean flag){ if (flag && getSimpleFlag(key)) {//假如為真不允許被覆蓋 return false; }else{ cacheMap.put(key, flag); return true; } } public synchronized static boolean setSimpleFlag(String key,long serverbegrundt){ if (cacheMap.get(key) == null) { cacheMap.put(key,serverbegrundt); return true; }else{ return false; } } //得到緩衝。同步靜態方法 private synchronized static Cache getCache(String key) { return (Cache) cacheMap.get(key); } //判斷是否存在一個緩衝 private synchronized static boolean hasCache(String key) { return cacheMap.containsKey(key); } //清除所有緩衝 public synchronized static void clearAll() { cacheMap.clear(); } //清除某類一特定緩衝,通過遍曆HASHMAP下的所有對象,來判斷它的KEY與傳入的TYPE是否匹配 public synchronized static void clearAll(String type) { Iterator i = cacheMap.entrySet().iterator(); String key; ArrayList<String> arr = new ArrayList<String>(); try { while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); key = (String) entry.getKey(); if (key.startsWith(type)) { //如果匹配則刪除掉 arr.add(key); } } for (int k = 0; k < arr.size(); k++) { clearOnly(arr.get(k)); } } catch (Exception ex) { ex.printStackTrace(); } } //清除指定的緩衝 public synchronized static void clearOnly(String key) { cacheMap.remove(key); } //載入緩衝 public synchronized static void putCache(String key, Cache obj) { cacheMap.put(key, obj); } //擷取緩衝資訊 public static Cache getCacheInfo(String key) { if (hasCache(key)) { Cache cache = getCache(key); if (cacheExpired(cache)) { //調用判斷是否終止方法 cache.setExpired(true); clearOnly(key); } return cache; }else return null; } //載入緩衝資訊 public static void putCacheInfo(String key, Cache obj, long dt,boolean expired) { Cache cache = new Cache(); cache.setKey(key); cache.setTimeOut(dt + System.currentTimeMillis()); //設定多久後更新緩衝 cache.setValue(obj); cache.setExpired(expired); //緩衝預設載入時,終止狀態為FALSE cacheMap.put(key, cache); } //重寫載入緩衝資訊方法 public static void putCacheInfo(String key,Cache obj,long dt){ Cache cache = new Cache(); cache.setKey(key); cache.setTimeOut(dt+System.currentTimeMillis()); cache.setValue(obj); cache.setExpired(false); cacheMap.put(key,cache); } //判斷緩衝是否終止 public static boolean cacheExpired(Cache cache) { if (null == cache) { //傳入的緩衝不存在 return false; } long nowDt = System.currentTimeMillis(); //系統當前的毫秒數 long cacheDt = cache.getTimeOut(); //緩衝內的到期毫秒數 if (cacheDt <= 0||cacheDt>nowDt) { //到期時間小於等於零時,或者到期時間大於目前時間時,則為FALSE return false; } else { //大於到期時間 即到期 return true; } } //擷取緩衝中的大小 public static int getCacheSize() { return cacheMap.size(); } //擷取指定的類型的大小 public static int getCacheSize(String type) { int k = 0; Iterator i = cacheMap.entrySet().iterator(); String key; try { while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); key = (String) entry.getKey(); if (key.indexOf(type) != -1) { //如果匹配則刪除掉 k++; } } } catch (Exception ex) { ex.printStackTrace(); } return k; } //擷取緩衝對象中的所有索引值名稱 public static ArrayList<String> getCacheAllkey() { ArrayList a = new ArrayList(); try { Iterator i = cacheMap.entrySet().iterator(); while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); a.add((String) entry.getKey()); } } catch (Exception ex) {} finally { return a; } } //擷取緩衝對象中指定類型 的索引值名稱 public static ArrayList<String> getCacheListkey(String type) { ArrayList a = new ArrayList(); String key; try { Iterator i = cacheMap.entrySet().iterator(); while (i.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry) i.next(); key = (String) entry.getKey(); if (key.indexOf(type) != -1) { a.add(key); } } } catch (Exception ex) {} finally { return a; } }}
3在你需要查詢資料的方法中加入緩衝方法,在增刪改查中,一般只在查詢方法中,加入緩衝,其他的一般不加,下面我們在方法中加入緩衝方法 如下
下面的方法是根據id查詢所有的列表
4 到這裡我們緩衝已經做好,當我們訪問時,我們把緩衝放在記憶體之中,當記憶體中有緩衝的時候直接從記憶體中去,如果沒有的話,在從資料庫中去,然後在放入緩衝中,這樣的話,會極大提高資料的訪問量,減少資料庫的壓力
public List<Estate> getAllEstateByUserId(String submitUserId) { String key=CacheManager.findAllEstate; List<Estate> listEstate; Cache cache= CacheManager.getCacheInfo(key); if (null == cache){ listEstate=estateMapper.getAllEstateByUserId(submitUserId); cache = new Cache(); cache.setKey(key); cache.setValue( listEstate); CacheManager.putCache(key, cache); }else { listEstate=(List<Estate>) cache.getValue(); } // return estateMapper.getAllEstateByUserId(submitUserId); return listEstate;}