緩存是Java中主要的內容,主要目的是緩解項目訪問數據庫的壓力以及提高訪問數據的效率,如下是經過Map實現java緩存的功能,並無用cache相關框架。css
1、緩存管理類 CacheMgr.java html
package com.henu.util; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * 緩存管理類 * * @author Administrator * */ public class CacheMgr { private static Map cacheMap = new HashMap(); private static Map cacheConfMap = new HashMap(); private static CacheMgr cm = null; // 構造方法 private CacheMgr() { } public static CacheMgr getInstance() { if (cm == null) { cm = new CacheMgr(); Thread t = new ClearCache(); t.start(); } return cm; } /** * 增長緩存 * * @param key * @param value * @param ccm * 緩存對象 * @return */ public boolean addCache(Object key, Object value, CacheConfModel ccm) { System.out.println("開始增長緩存-------------"); boolean flag = false; try { cacheMap.put(key, value); cacheConfMap.put(key, ccm); System.out.println("增長緩存結束-------------"); System.out.println("now addcache==" + cacheMap.size()); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 獲取緩存實體 */ public Object getValue(String key) { Object ob = cacheMap.get(key); if (ob != null) { return ob; } else { return null; } } /** * 獲取緩存數據的數量 * * @return */ public int getSize() { return cacheMap.size(); } /** * 刪除緩存 * * @param key * @return */ public boolean removeCache(Object key) { boolean flag = false; try { cacheMap.remove(key); cacheConfMap.remove(key); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 清除緩存的類 繼承Thread線程類 */ private static class ClearCache extends Thread { public void run() { while (true) { Set tempSet = new HashSet(); Set set = cacheConfMap.keySet(); Iterator it = set.iterator(); while (it.hasNext()) { Object key = it.next(); CacheConfModel ccm = (CacheConfModel) cacheConfMap.get(key); // 比較是否須要清除 if (!ccm.isForever()) { if ((new Date().getTime() - ccm.getBeginTime()) >= ccm .getDurableTime() * 60 * 1000) { // 能夠清除,先記錄下來 tempSet.add(key); } } } // 真正清除 Iterator tempIt = tempSet.iterator(); while (tempIt.hasNext()) { Object key = tempIt.next(); cacheMap.remove(key); cacheConfMap.remove(key); } System.out.println("now thread================>" + cacheMap.size()); // 休息 try { Thread.sleep(60 * 1000L); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
2、緩存屬性類 CacheConfModel.javajava
package com.henu.util; /** * 緩存屬性類 * * @author Administrator * */ public class CacheConfModel implements java.io.Serializable { private long beginTime;// 緩存開始時間 private boolean isForever = false;// 是否持久 private int durableTime;// 持續時間 public long getBeginTime() { return beginTime; } public void setBeginTime(long beginTime) { this.beginTime = beginTime; } public boolean isForever() { return isForever; } public void setForever(boolean isForever) { this.isForever = isForever; } public int getDurableTime() { return durableTime; } public void setDurableTime(int durableTime) { this.durableTime = durableTime; } }
3、配置啓動項目時自動加載 web.xmlweb
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>testCache</servlet-name> <servlet-class>cache.com.Cservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testCache</servlet-name> <url-pattern>/testCache.do</url-pattern> </servlet-mapping> <servlet> <servlet-name>cacheinitservlet</servlet-name> <servlet-class>cache.com.LoadCache</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4、自動加載緩存的類 LoadCache.java,在此類中實現你想要初始化的緩存數據數據庫
package cache.com; import java.util.Date; import javax.servlet.http.HttpServlet; import cache.com.CacheConfModel; import cache.com.CacheMgr; /** * 項目啓動時默認加載緩存數據類 * @author Administrator */ public class LoadCache extends HttpServlet{ public void init(){ addData(); } /** * 項目啓動時加載緩存 */ public void addData(){ System.out.println("進入加載緩存addData()………………。"); CacheMgr cm=CacheMgr.getInstance(); CacheConfModel cModel=new CacheConfModel(); Date d=new Date(); cModel.setBeginTime(d.getTime()); cModel.setDurableTime(60); cModel.setForever(true); cm.addCache("kk", "123", cModel);//在緩存加值 } }
5、寫一個測試類 Cservlet.java,我在這裏寫了一個servlet類進行測試的緩存
package cache.com; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 測試讀取、添加緩存數據等 * @author Administrator */ public class Cservlet extends HttpServlet{ public void service(HttpServletRequest request,HttpServletResponse response){ try { System.out.println("進入servlet類............"); request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); //3.設置響應類型 PrintWriter out = response.getWriter(); CacheMgr cm=CacheMgr.getInstance(); int numm=cm.getSize();//獲取緩存個數 Object ob=cm.getValue("kk"); System.out.println("numm===========//======"+numm); out.println("緩存個數爲:"+numm); out.println("緩存數值:value===="+ob); } catch (Exception e) { e.printStackTrace(); } } }
6、寫一個簡單的按鈕頁面 index.jspapp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <form action="testCache.do" method="post"> <button type="submit" >獲取緩存數據</button> </form> </body> </html>
啓動項目後點擊按鈕 「獲取緩存數據」 後,出現以下圖說明緩存成功併成功取值了框架