缓存是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缓存机制的简单实例的更多相关文章

  1. java反射机制的简单介绍

    参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...

  2. Java缓存机制

    1 Java缓存 1.1 jvm内置缓存 Java中实现缓存的方式有很多,比如用static hashMap基于内存缓存的jvm内置缓存,简单不实用,保对象的有效性和周期无法控制,容易造成内存急剧上升 ...

  3. JAVA RMI远程方法调用简单实例[转]

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外 一台 ...

  4. JAVA RMI远程方法调用简单实例(转载)

    来源:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html RMI的概念 RMI(Remote Method Invocati ...

  5. (转)java反射机制及简单工厂模式

    第一步,定义一个接口类 package factory.face; /** * 接口,为了保证返回的对象可以统一用 Product接受 * @author Administrator */ publi ...

  6. Java反射机制的简单学习

    今天看了一下Java的反射机制,就此记录一下. 首先,我们要先了解一下什么是反射? 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAV ...

  7. Java知识总结:Java反射机制(用实例理解)

    概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...

  8. java反射机制的简单使用

    java 反射机制 反射机制简介 参考地址 什么是反射机制 反射机制指程序在运行时能够获取自身的信息.在java中只要给定类的名字,就可以通过反射机制获得类的所有信息 反射机制的优缺点 首先了解一下动 ...

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

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

随机推荐

  1. 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了

    Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...

  2. python流行的原因

    12~14年是云计算最火的几年,大批创业公司和巨头挤破头地进军云计算领域,大家都在做IAAS,最著名的云计算开源平台OpenStack 就是基于Python 开发的,为此催生出不少Python 岗位 ...

  3. iOS Sprite Kit教程之xcode安装以及苹果帐号绑定

    iOS Sprite Kit教程之xcode安装以及苹果帐号绑定 其它的网站上下载安装Xcode 有时候,应用商店下载较慢,所以用户也可以选择从其他网站下载Xcode安装文件.下面讲解这种Xcode的 ...

  4. fiddler 手机装证书

    1: 打开浏览器的地址 输入fiddler 右上方的地址 172.21.14.197:8888 2: 然后点击页面里的 FiddlerRoot certificate 3: 最后验证下   iOS 1 ...

  5. centos+uwsgi+nginx+python+django服务器安装配置

    1.ssh登录后使用fdisk –l查看需要格式化硬盘的名称: 2.运行fdisk /dev/vdb,对数据盘进行分区,按照提示,依次输入n,p,1,两次回车,wq,分区开始.(注意数据盘的名称,和阿 ...

  6. 韩梦飞沙Android应用集合 想法

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 那些收藏的图片 那些收藏的微博 那些收藏的音乐 定时短信 音乐列表汇 每天都是快乐的

  7. [BZOJ5291][BJOI2018]链上二次求和(线段树)

    感觉自己做的麻烦了,但常数似乎不算差.(只是Luogu最慢的点不到2s本地要跑10+s) 感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法.(不过当然所有的做法都是分类大讨论,而我的方法手 ...

  8. BZOJ3473 字符串 广义后缀自动机

    今天主攻了下SAM 好多东西以前都没理解到 对于这道题 我们建一个自动机存所有串 每个穿last从1开始 对于自动机上每个点额外记一个cnt 表示能匹配到这个点的不同串个数 建完对每个串在自动机上匹配 ...

  9. OpenGL 模型视图投影矩阵 仿射矩阵

    矩阵基础知识 要对矩阵进行运算,必须先要了解矩阵的计算公式,这个知识的内容涉及到了线性代数. 我们知道在Cocos2dx中,有关于平移,旋转,缩放等等操作,都必须要进行矩阵的乘法. 只需要一张图就能理 ...

  10. PyQt QString 与 Python str&unicode

    昨日,将许久以前做的模拟网页登录脚本用PyQt封装了一下,结果出大问题了, 登录无数次都提示登录失败!!而不用PyQt实现的GUI登录直接脚本登录无数次都提示登录成功!!心中甚是伤痛,于是探究起来,解 ...