java map缓存

缓存是Java中主要的内容,主要目的是缓解项目访问数据库的压力以及提升访问数据的效率,以下是通过Map实现java缓存的功能,并没有用cache相关框架。

一、缓存管理类 CacheMgr.java

  1. package cache.com;  
  2.   
  3. import java.util.Date;  
  4. import java.util.HashMap;  
  5. import java.util.HashSet;  
  6. import java.util.Iterator;  
  7. import java.util.Map;  
  8. import java.util.Set;  
  9. /** 
  10.  *  缓存管理类 
  11.  * @author Administrator 
  12.  * 
  13.  */  
  14. public class CacheMgr {  
  15.       
  16.      private static Map cacheMap = new HashMap();  
  17.      private static Map cacheConfMap = new HashMap();  
  18.        
  19.      private static CacheMgr cm = null;  
  20.        
  21.      //构造方法  
  22.      private CacheMgr(){  
  23.      }  
  24.        
  25.       
  26.        
  27.      public static CacheMgr getInstance(){  
  28.           if(cm==null){  
  29.            cm = new CacheMgr();  
  30.            Thread t = new ClearCache();  
  31.            t.start();  
  32.           }  
  33.           return cm;  
  34.          }  
  35.        
  36.        
  37.      /** 
  38.       * 增加缓存 
  39.       * @param key 
  40.       * @param value 
  41.       * @param ccm 缓存对象 
  42.       * @return  
  43.       */  
  44.      public  boolean addCache(Object key,Object value,CacheConfModel ccm){  
  45.           System.out.println("开始增加缓存-------------");  
  46.           boolean flag = false;  
  47.           try {  
  48.               cacheMap.put(key, value);  
  49.               cacheConfMap.put(key, ccm);  
  50.               System.out.println("增加缓存结束-------------");  
  51.               System.out.println("now addcache=="+cacheMap.size());  
  52.               flag=true;  
  53.           } catch (Exception e) {  
  54.             e.printStackTrace();  
  55.           }  
  56.             
  57.           return flag;  
  58.          }  
  59.        
  60.        
  61.        /** 
  62.         * 获取缓存实体 
  63.         */  
  64.      public Object getValue(String key){  
  65.          Object ob=cacheMap.get(key);  
  66.          if(ob!=null){  
  67.              return ob;  
  68.          }else{  
  69.              return null;  
  70.          }  
  71.      }  
  72.        
  73.        
  74.         /** 
  75.          * 获取缓存数据的数量 
  76.          * @return 
  77.          */  
  78.         public int getSize(){  
  79.             return cacheMap.size();  
  80.         }  
  81.        
  82.           
  83.           
  84.        
  85.      /** 
  86.       * 删除缓存 
  87.       * @param key 
  88.       * @return  
  89.       */  
  90.      public  boolean removeCache(Object key){  
  91.          boolean flag=false;  
  92.          try {  
  93.               cacheMap.remove(key);  
  94.               cacheConfMap.remove(key);  
  95.               flag=true;  
  96.             } catch (Exception e) {  
  97.                 e.printStackTrace();  
  98.             }  
  99.           return flag;  
  100.          }  
  101.        
  102.        
  103.        
  104.      /** 
  105.       * 清除缓存的类 
  106.       * 继承Thread线程类 
  107.       */  
  108.      private static class ClearCache extends Thread{  
  109.           public void run(){  
  110.            while(true){  
  111.             Set tempSet = new HashSet();  
  112.             Set set = cacheConfMap.keySet();  
  113.             Iterator it = set.iterator();  
  114.             while(it.hasNext()){  
  115.              Object key = it.next();  
  116.              CacheConfModel ccm = (CacheConfModel)cacheConfMap.get(key);  
  117.              //比较是否需要清除  
  118.              if(!ccm.isForever()){  
  119.               if((new Date().getTime()-ccm.getBeginTime())>= ccm.getDurableTime()*60*1000){  
  120.                //可以清除,先记录下来  
  121.                tempSet.add(key);  
  122.               }  
  123.              }  
  124.             }  
  125.             //真正清除  
  126.             Iterator tempIt = tempSet.iterator();  
  127.             while(tempIt.hasNext()){  
  128.              Object key = tempIt.next();  
  129.              cacheMap.remove(key);  
  130.              cacheConfMap.remove(key);  
  131.                
  132.             }  
  133.             System.out.println("now thread================>"+cacheMap.size());  
  134.             //休息  
  135.             try {  
  136.              Thread.sleep(60*1000L);  
  137.             } catch (InterruptedException e) {  
  138.              e.printStackTrace();  
  139.             }  
  140.            }  
  141.           }  
  142.          }  
  143.        
  144.        
  145.        
  146.        
  147. }  

二、缓存属性类 CacheConfModel.java

  1. package cache.com;  
  2. /** 
  3.  * 缓存属性类 
  4.  * @author Administrator 
  5.  * 
  6.  */  
  7. public class CacheConfModel implements java.io.Serializable{  
  8.       
  9.      private long beginTime;//缓存开始时间  
  10.      private boolean isForever = false;//是否持久  
  11.      private int durableTime;//持续时间  
  12.        
  13.      public long getBeginTime() {  
  14.           return beginTime;  
  15.          }  
  16.          public void setBeginTime(long beginTime) {  
  17.           this.beginTime = beginTime;  
  18.          }  
  19.          public boolean isForever() {  
  20.           return isForever;  
  21.          }  
  22.          public void setForever(boolean isForever) {  
  23.           this.isForever = isForever;  
  24.          }  
  25.          public int getDurableTime() {  
  26.           return durableTime;  
  27.          }  
  28.          public void setDurableTime(int durableTime) {  
  29.           this.durableTime = durableTime;  
  30.          }  
  31.   
  32. }  

三、配置启动项目时自动加载 web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.       
  8.     <servlet>  
  9.       <servlet-name>testCache</servlet-name>  
  10.       <servlet-class>cache.com.Cservlet</servlet-class>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.       <servlet-name>testCache</servlet-name>  
  14.       <url-pattern>/testCache.do</url-pattern>  
  15.     </servlet-mapping>  
  16.       
  17.     <servlet>  
  18.         <servlet-name>cacheinitservlet</servlet-name>  
  19.         <servlet-class>cache.com.LoadCache</servlet-class>  
  20.         <load-on-startup>2</load-on-startup>  
  21.     </servlet>  
  22.       
  23.   <welcome-file-list>  
  24.     <welcome-file>index.jsp</welcome-file>  
  25.   </welcome-file-list>  
  26. </web-app>  

四、自动加载缓存的类 LoadCache.java

  在此类中实现你想要初始化的缓存数据

  1. package cache.com;  
  2.   
  3. import java.util.Date;  
  4. import javax.servlet.http.HttpServlet;  
  5.   
  6. import cache.com.CacheConfModel;  
  7. import cache.com.CacheMgr;  
  8. /** 
  9.  * 项目启动时默认加载缓存数据类 
  10.  * @author Administrator 
  11.  */  
  12. public class LoadCache extends HttpServlet{  
  13.       
  14.   
  15.     public void init(){  
  16.         addData();  
  17.     }  
  18.       
  19.     /** 
  20.      * 项目启动时加载缓存 
  21.      */  
  22.     public void addData(){  
  23.         System.out.println("进入加载缓存addData()………………。");  
  24.         CacheMgr cm=CacheMgr.getInstance();  
  25.         CacheConfModel cModel=new CacheConfModel();  
  26.         Date d=new Date();  
  27.         cModel.setBeginTime(d.getTime());  
  28.         cModel.setDurableTime(60);  
  29.         cModel.setForever(true);  
  30.         cm.addCache("kk""123", cModel);//在缓存加值  
  31.     }  
  32.       
  33. }  

五、写一个测试类 Cservlet.java,我在这里写了一个servlet类进行测试的

  1. package cache.com;  
  2.   
  3. import java.io.PrintWriter;  
  4.   
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. /** 
  9.  * 测试读取、添加缓存数据等 
  10.  * @author Administrator 
  11.  */  
  12. public class Cservlet extends HttpServlet{  
  13.       
  14.     public void service(HttpServletRequest request,HttpServletResponse response){  
  15.         try {  
  16.             System.out.println("进入servlet类............");  
  17.             request.setCharacterEncoding("utf-8");  
  18.             response.setContentType("text/html;charset=UTF-8");   //3.设置响应类型  
  19.   
  20.             PrintWriter out = response.getWriter();  
  21.               
  22.               
  23.             CacheMgr cm=CacheMgr.getInstance();  
  24.               
  25.             int numm=cm.getSize();//获取缓存个数  
  26.             Object ob=cm.getValue("kk");  
  27.             System.out.println("numm===========//======"+numm);  
  28.             out.println("缓存个数为:"+numm);  
  29.             out.println("缓存数值:value===="+ob);  
  30.               
  31.         } catch (Exception e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.           
  35.       
  36.           
  37.     }  
  38.   
  39. }  

六、写一个简单的按钮页面 index.jsp
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!-- 
  19.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     <form action="testCache.do" method="post">  
  25.       <button type="submit" >获取缓存数据</button>  
  26.       
  27.     </form>  
  28.   </body>  
  29. </html>  


启动项目后点击按钮 “获取缓存数据”后,出现如下图说明缓存成功并成功取值了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值