当前位置: 首页 > news >正文

ehcache使用_技术分享|浅谈EhCache实现页面缓存和数据缓存

a632836e9fbbb5a9415ac106ad8a5b03.png

江      枫

合肥科技研发中心

15c83418915a41210e92fe7e3090b413.png

定义解析

EhCache是一个Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的缓存。EhCache使用范围广泛,是开源的Java分布式缓存。EhCache缓存数据有两级:内存和磁盘,因此无需担心容量问题,缓存数据会在虚拟机重启的过程中写入磁盘。

d92aa196c7b550d4dff84f1be8a7138f.gif

应用场景

EhCache的应用场景有两个:页面缓存和数据缓存。

1. 页面缓存

几乎所有的网站的首页都是访问率最高的,而首页上的数据来源又是非常广泛的,有可能来自不同的数据库,给首页做缓存可以有效降低服务器的压力、提高客户端响应速度。

应用结构一般都是page-filter-action-service-dao-db,页面缓存一般做在page-filter之间,这样离客户最近。当第一个用户请求之后,页面被缓存,第二个用户请求走到filter的时候,服务器会先去ehcache缓存中查找,发现页面缓存存在,就直接将缓存的页面作为结果返回给用户,后面的action-service-dao-db过程都省略了,提高了相应速度,降低了服务器压力。

SimplePageCachingFilter是ehcache-web模块下页面缓存Filter的一个简单实现,它适用于可以压缩的Http响应,如HTML、XML、JSON等。SimplePageCachingFilter使用calculateKey()方法获取,其内部逻辑是获取请求时的URI及后面的查询字符串作为key进行返回(如‘/index.jsp?user=abc’),这使得它的应用范围非常广:它不依赖于主机名和端口号,所以它适用于多个域或多个端口请求同样内容的情况。如果有需要,还可以对calculateKey方法进行重写。如果使用SimplePageCachingFilter提供的calculateKey方法,那么每次生成的key都不相同,缓存就没有意义。这种情况下我们可以重写calculateKey方法。

步骤一:首先配置ehcache.xml。

bb3d9a88980ff323a1c04729390865ff.png

timeToLiveSeconds设置该数据能够在缓存中存活的最长时间为60秒,timeToIdleSecnds设置相邻2次获取数据的最大时间间隔,如果两次获取数据的时间间隔大于timeToIdleSecnds则得到null,该数据已经无法获取,timeToIdleSecnds大于timeToLiveSeconds才有意义。memoryStroreEvictionPolicy指定缓存的驱逐策略。ehcache有三种缓存驱逐策略:FIFO

(先进先出),LFU(最少被使用),LRU(最近最少使用)。

步骤二:在web.xml中添加页面缓存过滤器PageCachingFilter。

51b14ee05c75405df913900469211353.png

步骤三:编写controller测试类。

b885e478b8e5a91cb8f44c68ed974e91.png

testPageCache.jsp的代码片段:

b431a9ae2f846c3a6b1f469c23f48a87.png

步骤四:访问/pageController/testPageCache.do观察页面输出的时间,在该缓存的生命周期内,且相邻两次访问小于timeToIdleSeconds,页面输出的时间没有变化。当过了缓存生命周期或者相邻两次访问间隔时间大于timeToIdleSeconds,页面输出时间立马发生改变。

2. 数据缓存

一些配置信息,如后台的某些不经常改变的配置信息都可以使用EhCache缓存起来。以下是EhCache实现数据缓存的一个例子:

步骤一:配置ehcache.xml配置文件。

ab29a63e4e87fff6ad8c6f10f56ff40d.png

步骤二:编写测试类。

a225f9bba66cdff5fae0c0f14edad668.png

其中CacheManager是Cache的容器对象,用来管理(添加或删除)Cache的生命周期;Element是需要缓存的元素,它维护着一个键值对,一个Cache可以包含多个Element。

d92aa196c7b550d4dff84f1be8a7138f.gif

总结展望

本文介绍了如何通过EhCache实现页面缓存和数据缓存,后续将持续研究EhCache的效率,通过性能测试的手段分别测试读数据库的方式获取数据的网站首页和适用EhCache获取数据的网站首页,探索网站首页的性能提升比例。

d92aa196c7b550d4dff84f1be8a7138f.gif d068b8b1776925eda5eb5b6737c34ae3.gif c99f28fb1de327b14bc90407712f7515.gif

相关文章:

  • elasticsearch date_史上最全的ElasticSearch系列之基础
  • python字符串函数参数_python:字符串常用函数
  • fabric白皮书_安全: Intel发布CSME安全白皮书
  • resnet50能用cpu跑吗_锐龙5000上市倒计时 官方告诉你哪些主板能用
  • web个人主页制作代码_Web前端开发是干嘛的?Web前端工资一般多少?
  • java动态代理_Java 动态代理及 RPC 框架介绍
  • 关于python的赋值说法_Python中tuple+=赋值的四个问题
  • python如何截取日期中的月份_python – 从给定日期开始提取日,月和年的...
  • python3 beautifulsoup_(转载) python3: beautifulsoup的使用
  • 为什么除零错会导致程序崩溃_Firefox 76.0.1紧急发布:修复导致部分扩展程序崩溃问题...
  • python3 zipfile解压出错_解决python3中解压zip文件是文件名乱码的问题
  • jmeter 线程执行顺序_面试官:线程顺序执行,这么多答案你都答不上来?
  • python可变参数的特点_Java可变参数 Python可变参数 Scala可变参数
  • mysql 多列合并为一列_mysql面试名词聚簇索引、二级索引、最左匹配、覆盖索引、回表
  • 备份类型 事务日志_InnoDB事务日志redo log和undo log详解
  • co.js - 让异步代码同步化
  • css选择器
  • HTML-表单
  • java概述
  • js对象的深浅拷贝
  • JS基础之数据类型、对象、原型、原型链、继承
  • Meteor的表单提交:Form
  • rc-form之最单纯情况
  • 聊一聊前端的监控
  • 数据结构java版之冒泡排序及优化
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # include “ “ 和 # include < >两者的区别
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #include到底该写在哪
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (02)Hive SQL编译成MapReduce任务的过程
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (a /b)*c的值
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (二)WCF的Binding模型
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)详解PHP处理密码的几种方式
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET Core 项目指定SDK版本
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Framework .NET Core与 .NET 的区别
  • .Net 中Partitioner static与dynamic的性能对比
  • .Net(C#)自定义WinForm控件之小结篇
  • ??myeclipse+tomcat
  • @Autowired @Resource @Qualifier的区别
  • @selector(..)警告提示
  • [ 转载 ] SharePoint 资料
  • [2544]最短路 (两种算法)(HDU)
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android 13]Input系列--获取触摸窗口