1. 程式人生 > >Map實現java緩存機制的簡單實例

Map實現java緩存機制的簡單實例

個數 charset shm run 測試的 分享 初始化 tty tco

緩存是Java中主要的內容,主要目的是緩解項目訪問數據庫的壓力以及提升訪問數據的效率,以下是通過Map實現java緩存的功能,並沒有用cache相關框架。

一、緩存管理類 CacheMgr.java

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(); } } } } }

二、緩存屬性類 CacheConfModel.java

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;
    }

}

三、配置啟動項目時自動加載 web.xml

<?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>

四、自動加載緩存的類 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);//在緩存加值
    }
    
}

五、寫一個測試類 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();
        }
         
    }

}

六、寫一個簡單的按鈕頁面 index.jsp

<%@ 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>

啟動項目後點擊按鈕 “獲取緩存數據” 後,出現如下圖說明緩存成功並成功取值了

技術分享

Map實現java緩存機制的簡單實例