Map实现java缓存机制的简单实例
生活随笔
收集整理的這篇文章主要介紹了
Map实现java缓存机制的简单实例
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
緩存是Java中主要的內(nèi)容,主要目的是緩解項(xiàng)目訪問(wèn)數(shù)據(jù)庫(kù)的壓力以及提升訪問(wèn)數(shù)據(jù)的效率,以下是通過(guò)Map實(shí)現(xiàn)java緩存的功能,并沒(méi)有用cache相關(guān)框架。
一、緩存管理類 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;// 構(gòu)造方法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* 緩存對(duì)象* @return*/public boolean addCache(Object key, Object value, CacheConfModel ccm) {System.out.println("開(kāi)始增加緩存-------------");boolean flag = false;try {cacheMap.put(key, value);cacheConfMap.put(key, ccm);System.out.println("增加緩存結(jié)束-------------");System.out.println("now addcache==" + cacheMap.size());flag = true;} catch (Exception e) {e.printStackTrace();}return flag;}/*** 獲取緩存實(shí)體*/public Object getValue(String key) {Object ob = cacheMap.get(key);if (ob != null) {return ob;} else {return null;}}/*** 獲取緩存數(shù)據(jù)的數(shù)量* * @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) {// 可以清除,先記錄下來(lái) 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;// 緩存開(kāi)始時(shí)間private boolean isForever = false;// 是否持久private int durableTime;// 持續(xù)時(shí)間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;}}三、配置啟動(dòng)項(xiàng)目時(shí)自動(dòng)加載 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>四、自動(dòng)加載緩存的類 LoadCache.java,在此類中實(shí)現(xiàn)你想要初始化的緩存數(shù)據(jù)
package cache.com;import java.util.Date; import javax.servlet.http.HttpServlet;import cache.com.CacheConfModel; import cache.com.CacheMgr; /*** 項(xiàng)目啟動(dòng)時(shí)默認(rèn)加載緩存數(shù)據(jù)類* @author Administrator*/ public class LoadCache extends HttpServlet{public void init(){addData();}/*** 項(xiàng)目啟動(dòng)時(shí)加載緩存*/public void addData(){System.out.println("進(jìn)入加載緩存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);//在緩存加值 }}五、寫(xiě)一個(gè)測(cè)試類 Cservlet.java,我在這里寫(xiě)了一個(gè)servlet類進(jìn)行測(cè)試的
package cache.com;import java.io.PrintWriter;import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /*** 測(cè)試讀取、添加緩存數(shù)據(jù)等* @author Administrator*/ public class Cservlet extends HttpServlet{public void service(HttpServletRequest request,HttpServletResponse response){try {System.out.println("進(jìn)入servlet類............");request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8"); //3.設(shè)置響應(yīng)類型 PrintWriter out = response.getWriter();CacheMgr cm=CacheMgr.getInstance();int numm=cm.getSize();//獲取緩存?zhèn)€數(shù)Object ob=cm.getValue("kk");System.out.println("numm===========//======"+numm);out.println("緩存?zhèn)€數(shù)為:"+numm);out.println("緩存數(shù)值:value===="+ob);} catch (Exception e) {e.printStackTrace();}}}六、寫(xiě)一個(gè)簡(jiǎn)單的按鈕頁(yè)面 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" >獲取緩存數(shù)據(jù)</button></form></body> </html>啟動(dòng)項(xiàng)目后點(diǎn)擊按鈕 “獲取緩存數(shù)據(jù)” 后,出現(xiàn)如下圖說(shuō)明緩存成功并成功取值了
轉(zhuǎn)載于:https://www.cnblogs.com/henuyuxiang/p/7486120.html
總結(jié)
以上是生活随笔為你收集整理的Map实现java缓存机制的简单实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pandas read_csv 出现中
- 下一篇: bzoj 4515: [Sdoi2016