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

緩存是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>

啓動項目後點擊按鈕 「獲取緩存數據」 後,出現以下圖說明緩存成功併成功取值了框架

相關文章
相關標籤/搜索