转载自  javaweb项目搭建ehcache缓存系统

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider,同时在项目开发中也被广泛使用到。接下来就以用户缓存为例,基于javaweb项目来搭建ehcache缓存系统。

主要涉及核心原理和实现要点:项目是基于spring框架来统一管理和配置bean的,所以在spring中配置缓存,定义EhCacheManagerFactoryBean,同时指向其ehcache配置文件ehcache.xml,ehcache.xml则有我们自己根据项目情况来定义一些缓存策略,如:cache中元素的生存时间、cache 中最多可以存放的元素的数量和内存存储与释放策略等等。java代码中则可以定义一个统一的缓存管理类去持有net.sf.ehcache.CacheManager实例,来代理往数据库中操作数据的行为。关于CacheManager实例的获取,则可以通过实现ApplicationContextAware, DisposableBean接口,分别重写其setApplicationContext()方法,注入ApplicationContext到静态变量中和destroy()方法,在ApplicationContext关闭时清理静态变量。这样以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext,进而调用其getBean()方法来获得CacheManager实例。拿数据是先getByCache(),若缓存中存在数据则直接返回该数据,若缓存中不存在数据,再执行getByDb(),从数据库中拿数据,同时将数据存进缓存中。

1、首先从web.xml部署文件入口进行配置

<!-- 应用程序Spring上下文配置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext*.xml,</param-value></context-param>
<!-- 自定义监听器 继承自spring上下文加载监听器 --><listener><listener-class>com.schoolnet.sys.listener.WebContextListener</listener-class></listener>

继承自spring上下文加载监听器的WebContextListener类,可以在web启动时做一些处理

WebContextListener .java

public class WebContextListener extends org.springframework.web.context.ContextLoaderListener {@Overridepublic WebApplicationContext initWebApplicationContext(ServletContext servletContext) {if (!printKeyLoadMessage()){return null;}return super.initWebApplicationContext(servletContext);}private static boolean printKeyLoadMessage(){StringBuilder sb = new StringBuilder();sb.append("\r\n======================================================================\r\n");sb.append("\r\n    欢迎使用 校园网  - EhCache缓存系统搭建\r\n");sb.append("\r\n======================================================================\r\n");System.out.println(sb.toString());return true;}
}

2、applicationContex.xml中配置ehcache缓存

<!-- 加载配置属性文件 --><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="fileEncoding" value="UTF-8" /><property name="locations"><list><value>classpath:schoolnet.properties</value></list></property></bean>
<!-- 缓存配置 --><bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"><property name="configLocation" value="classpath:${ehcache.configFile}" /></bean>

3、schoolnet.properties

ehcache.configFile=cache/ehcache.xml(源码包下的cache文件夹中)

4、ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" name="defaultCache"><diskStore path="../temp/jeesite/ehcache" /><!-- 默认缓存配置. --><defaultCache maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600"overflowToDisk="true" maxEntriesLocalDisk="100000" /><!-- 系统缓存 --><cache name="sysCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/><!-- 用户缓存 --><cache name="userCache" maxEntriesLocalHeap="100" eternal="true" overflowToDisk="true"/><!-- 系统活动会话缓存 --><cache name="activeSessionsCache" maxEntriesLocalHeap="10000" overflowToDisk="true"eternal="true" timeToLiveSeconds="0" timeToIdleSeconds="0"diskPersistent="true" diskExpiryThreadIntervalSeconds="600"/><!-- 简单页面缓存<cache name="SimplePageCachingFilter" maxEntriesLocalHeap="100" eternal="false" overflowToDisk="true"timeToIdleSeconds="120" timeToLiveSeconds="120" memoryStoreEvictionPolicy="LFU"/> --></ehcache>

一些配置参数的说明

maxElementsInMemory :cache 中最多可以存放的元素的数量。如果放入cache中的元素超过这个数值,有两种情况:1、若overflowToDisk的属性值为true,会将cache中多出的元素放入磁盘文件中。2、若overflowToDisk的属性值为false,会根据memoryStoreEvictionPolicy的策略替换cache中原有的元素。
eternal :意思是是否永驻内存。如果值是true,cache中的元素将一直保存在内存中,不会因为时间超时而丢失,所以在这个值为true的时候,timeToIdleSeconds和timeToLiveSeconds两个属性的值就不起作用了。
timeToIdleSeconds :就是访问这个cache中元素的最大间隔时间。如果超过这个时间没有访问这个cache中的某个元素,那么这个元素将被从cache中清除。
timeToLiveSeconds : 这是cache中元素的生存时间。意思是从cache中的某个元素从创建到消亡的时间,从创建开始计时,当超过这个时间,这个元素将被从cache中清除。
overflowToDisk :溢出是否写入磁盘。系统会根据标签<diskStore path="java.io.tmpdir"/> 中path的值查找对应的属性值,如果系统的java.io.tmpdir的值是 D:/temp,写入磁盘的文件就会放在这个文件夹下。文件的名称是cache的名称,后缀名的data。如:CACHE_FUNC.data。这个属性在解释maxElementsInMemory的时候也已经说过了。
diskExpiryThreadIntervalSeconds  :磁盘缓存的清理线程运行间隔
memoryStoreEvictionPolicy :内存存储与释放策略。有三个值:
LRU -least recently used
LFU -least frequently used
FIFO-first in first out, the oldest element by creation time
diskPersistent : 是否持久化磁盘缓存。当这个属性的值为true时,系统在初始化的时候会在磁盘中查找文件名为cache名称,后缀名为index的的文件,如CACHE_FUNC.index 。这个文件中存放了已经持久化在磁盘中的cache的index,找到后把cache加载到内存。要想把cache真正持久化到磁盘,写程序时必须注意,在是用net.sf.ehcache.Cache的void put (Element element)方法后要使用void flush()方法。

5、CacheUtils.java

/*** Cache工具类*/
public class CacheUtils {private static CacheManager cacheManager = ((CacheManager)SpringContext.getBean("cacheManager"));private static final String SYS_CACHE = "sysCache";/*** 获取SYS_CACHE缓存* @param key* @return*/public static Object get(String key) {return get(SYS_CACHE, key);}/*** 写入SYS_CACHE缓存* @param key* @return*/public static void put(String key, Object value) {put(SYS_CACHE, key, value);}/*** 从SYS_CACHE缓存中移除* @param key* @return*/public static void remove(String key) {remove(SYS_CACHE, key);}/*** 获取缓存* @param cacheName* @param key* @return*/public static Object get(String cacheName, String key) {Element element = getCache(cacheName).get(key);return element==null?null:element.getObjectValue();}/*** 写入缓存* @param cacheName* @param key* @param value*/public static void put(String cacheName, String key, Object value) {Element element = new Element(key, value);getCache(cacheName).put(element);}/*** 从缓存中移除* @param cacheName* @param key*/public static void remove(String cacheName, String key) {getCache(cacheName).remove(key);}/*** 获得一个Cache,没有则创建一个。* @param cacheName* @return*/private static Cache getCache(String cacheName){Cache cache = cacheManager.getCache(cacheName);if (cache == null){cacheManager.addCache(cacheName);cache = cacheManager.getCache(cacheName);cache.getCacheConfiguration().setEternal(true);}return cache;}public static CacheManager getCacheManager() {return cacheManager;}}
6、SpringContext.java,用类获得ApplicationContext实例@Component
public class SpringContext implements ApplicationContextAware,DisposableBean{private static ApplicationContext applicationContext;/*** 取得存储在静态变量中的ApplicationContext.*/@Overridepublic void setApplicationContext(ApplicationContext context)throws BeansException {try {applicationContext=context;} catch (Exception e) {e.printStackTrace();}}/*** 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.*/public static <T> T getBean(String name){return (T) applicationContext.getBean(name);}public static String[] getBeanNamesForType(Class<?> type){return applicationContext.getBeanNamesForType(type);}/*** 实现DisposableBean接口, 在Context关闭时清理静态变量.*/@Overridepublic void destroy() throws Exception {applicationContext = null;}
}

7、UserUtils.java

/*** 用户工具类*/
public class UserUtils {private static UserDao userDao = SpringContextHolder.getBean(UserDao.class);private static Map<String, Object> cacheMap;/*** 根据ID获取用户* @param id* @return 取不到返回null*/public static User getUser(String id){User user = (User)CacheUtils.get("userCache", "id_" + id);if (user ==  null){user = userDao.get(id);if (user == null){return null;}CacheUtils.put("userCache", "id_" + user.getId(), user);CacheUtils.put("userCache", "ln" + user.getLoginName(), user);}return user;}/*** 根据登录名获取用户* @param loginName* @return 取不到返回null*/public static User getByLoginName(String loginName){User user = (User)CacheUtils.get("userCache", "ln" + loginName);if (user == null){user = userDao.getByLoginName(new User(null, loginName));if (user == null){return null;}CacheUtils.put("userCache", "id_" + user.getId(), user);CacheUtils.put("userCache", "ln" + user.getLoginName(), user);}return user;}/*** 清除用户缓存* @param user*/public static void clearCache(User user){CacheUtils.remove("userCache", "id_" + user.getId());CacheUtils.remove("userCache", "ln" + user.getLoginName());CacheUtils.remove("userCache", "ln" + user.getOldLoginName());}
}

javaweb项目搭建ehcache缓存系统相关推荐

  1. JavaWeb项目:简易小米商城系统

    Web项目:MyShop简易小米商城系统 一.系统概述 二.系统开发环境 三.涉及技术 四.系统功能及使用说明 五.作者杂谈 六.尾声 七.gitee地址: (源码见文末) 一.系统概述 本系统是一个 ...

  2. 路由到另外一个页面_Nextjs使用解读一(项目搭建与路由系统)

    文章说明: 1. 之前想搭建个人博客,由于学习的是react技术栈,所以就到处搜罗资料学了nextjs,配合koa就把博客搭起来了.该系列文章基于我的学习笔记,重新整理了一遍,如果有错误之处,还请指正 ...

  3. 在集群环境中使用 EhCache 缓存系统|RMI 集群模式

    RMI 是 Java 的一种远程方法调用技术,是一种点对点的基于 Java 对象的通讯方式.EhCache 从 1.2 版本开始就支持 RMI 方式的缓存集群.在集群环境中 EhCache 所有缓存对 ...

  4. JavaWeb项目实战 - SpringBoot日记本系统(第一期)

    哈喽,我是兔哥呀,终于啊,这个SpringBoot日记本系统完成啦.(虽然留了一堆BUG) 撒花,写教程是真的很累的一件事情. 第一期教程一共9个小节: 大家可以直接关注这个专栏: SpringBoo ...

  5. JavaWeb项目搭建准备工作

    1.搭建一个maven web 项目 2.配置Tomcat 3.测试项目是否能够跑起来 4.导入项目中遇到的jar包; jsp,servler,jstl,stand,mysql驱动 5.创建项目包结构 ...

  6. javaweb项目搭建

    1,搭建一个maven web项目 2,配置tomcat 3,测试项目是否能够运行 4,导入项目中会遇到的jar包 jsp,servlet,mysql,jstl... 5,创建项目包结构 5,编写实体 ...

  7. JavaWeb项目之租车系统管理系统

    实体类User(管理员) package com.hnjd.entity; public class UserInfo {private int uid;private String uname;pr ...

  8. JavaWeb项目:新闻发布系统01(登录新闻增加)

    上次给大家介绍了一下页面的跳转和数据库的连接,不知道大家都记住了没有啊,今天就来接着给大家分享一下如何制作一个简单的新闻小项目吧,会用到之前给大家分享的一些知识哦,不知道大家都记住了没有,赶紧来一起动 ...

  9. JavaWeb项目:新闻发布系统02(新闻系统功能制作)

    上一期给大家介绍了新闻发布系统的登录和增加功能的制作,接下来这期继续给大家来介绍新闻系统功能制作 目录 一,首页的数据显示: 效果图: 插入数据前: 插入数据后: 代码: 二,修改功能: 效果图: 代 ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义分组颜色、主题)实战(dot plot)
  2. 阿里巴巴宣布成立人工智能治理与可持续发展实验室
  3. mysql 游标异常_mysql中的游标和异常捕捉
  4. 设计模式:控制反转(Inversion Of Control)
  5. 利用jQuery对无序列表排序 http://www.apkbus.com/android-80639-1-1.html
  6. 华为服务器显示红色的心跳,服务器心跳检查
  7. 笔记(用Python做些事情)--变量(数字、字符串)
  8. Django从理论到实战(part53)--CSRF攻击
  9. 看看这帮猴子的伪原创工具
  10. E 定向 牛客练习赛25
  11. 数据库系统工程师输给了计算机等级考试二级
  12. Daemon Process
  13. java class类
  14. C#在winform中页面跳转实现
  15. vue跨域/webpack跨域
  16. python递归函数分叉树枝_python递归函数绘制分形树的方法
  17. java把在线图片转化流_图片转换图片流方法(二进制流)
  18. 详解深度学习中的梯度消失、爆炸原因及其解决方法
  19. 显卡排行榜天梯图2022 显卡性能天梯图2022
  20. 20162327WJH第三次实验——查找与排序2

热门文章

  1. [MyBatisPlus]乐观锁和悲观锁
  2. 二叉树的存储结构及四种遍历(C语言)
  3. 数据结构与算法一篇帮助你吃下KMP算法
  4. python unpack_ip地址处理每天10行python代码系列
  5. icoding复习6 图
  6. 数据结构------选择排序
  7. python查看CNN训练模型参数
  8. Java修炼之路——基础篇——值传递
  9. Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges dfs树/拓扑找环
  10. 【NOIP模拟】彩色树【树形dp】【树链剖分性质】【复杂度分析】