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

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

转载于:https://www.cnblogs.com/henuyuxiang/p/7486120.html

Map实现java缓存机制的简单实例相关推荐

  1. 用Java 开发 WebService Axis简单实例

    用 Java 开发 WebService Axis 简单实例 在开发之前, 先了解一下AXIS,axis目前出现的2版本以其灵活性,快速开发工具的集成高于xfire而使用者居其上.用Eclipse开发 ...

  2. Appium+Java环境搭建及简单实例

    Appium+Java环境搭建及简单实例 一.下载jdk并配置好环境 二.下载Android-sdk并配置好环境 三.下载Eclipse软件 四.下载Node.js 下载地址:https://node ...

  3. Java反射机制(简单易懂)

    文章目录 前言 一.反射机制 二.反射的用途 三.反射相关的类(重要) 3.1 Class类(反射机制的起源 ) 3.2 通过反射调用构造方法 3.3 通过反射调用普通方法 3.4 通过反射调用类属性 ...

  4. java反射机制的简单使用和优缺点

    java反射机制的使用 一.反射是什么? JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取类信息以及动 ...

  5. JAVA入门[18]-JdbcTemplate简单实例

    一.关于JdbcTemplate JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询. Spring数据访问模板:在数据库操作 ...

  6. java 消息机制 ActiveMQ入门实例

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt180 1.下载ActiveMQ  去官方网站下载:http://active ...

  7. java 抽象工厂模式简单实例

    抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生. 类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易.包含有 ...

  8. android java调用c_Android JNI简单实例(android 调用C/C++代码)

    Android的jni实例 android 的应用程序(Dalvik VM)中使用JNI(Java Native Interface)调用C/C++开发的共享库. c/c++中调用java程序的方法以 ...

  9. JNI之java调用c库简单实例

    一.适用: 因为架构迁移或者开发需要,有时候需要在android应用开发中,调用已有的c语言开发库,此时可能需要用到JNI. 二.示例: 1.Android Studio安装"合适的&quo ...

最新文章

  1. 使用id_rsa进行ssh连接minikube
  2. Redis概述、数据类型
  3. [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量
  4. 关于gedit的编码问题
  5. dbms_DBMS | 并发控制
  6. 大整数乘法(Java)
  7. java excel相同的合并_java servlet导出EXCEL并合并EXCEL相同值的单元格(Apache POI技术)...
  8. Swift开发实例:苹果Swift编程语言新手教程中文版+FlappyBird,2048游戏源代码
  9. solid 铝型材框架_solidworks铝型材库
  10. 微信自定义菜单java_使用Java语言开发微信公众平台(八)——自定义菜单功能
  11. php PHP-FPM进程数的设定
  12. UCF101数据集处理
  13. 腾讯认证QQ空间秒升级为专业版方法!
  14. laravel maatwebsite/excel3.1 导入导出详解
  15. Matplotlib折线图(绘图实例+代码详解)
  16. 【2D detection】Deformable DETR论文阅读记录
  17. DirtyWordsFilter(脏字过滤)
  18. DRM驱动(二)之DRM驱动模块简介
  19. 数学基础知识-排列与组合
  20. android ftp 链接不上去,安卓手机无法连接电脑上的ftp(vsftpd)服务器

热门文章

  1. (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功
  2. 排序算法二:归并排序(Merge sort)
  3. 我的技术家园,吸取精神食粮的天堂
  4. c语言中宏替换时的顺序
  5. tslib 编译移植步骤
  6. Android 4.4.2 动态添加JNI库方法记录 (一 JNI库层)
  7. qstring转qchar_Qt 对QString操作
  8. python快速整理excel_使用pandas包用python清理excel数据
  9. onenote复制出来是图片_你真的了解 OneNote 吗?
  10. 北京协和医学院823计算机原理,2017年北京协和医学院放射医学研究所(天津)823计算机原理考研题库...