为什么80%的码农都做不了架构师?>>>   

关于缓存的话题,在坛子里已经有很多讨论,简单的来说,如果一个应用中80% 的时间内都在访问20% 的数据,那么,这时候就应该使用缓存了。这个和长尾理论正好相悖,其实也不是相悖,只是不同的理论使用的场景不同。在80/20 原则生效的地方,我们都应该考虑是否可以使用缓存。但即使是这样,缓存也有不同的用法,举个例子,一个网站的首页估计是被访问的次数最多的,我们可以考虑给首页做一个页面缓存,而如果在某个页面上,比如说javaeye 的java 版区只有前几个页面是访问最频繁的,(假设javaeye 是使用hibernate ,当然这只是假设,我们都知道javaeye 是使用ror 开发的)那么我们就可以考虑给java 版区的record 做二级缓存了,因为二级缓存中是按照对象的id 来保存的,所以应该来说这前面几页使用的对象会一直存在于缓存之中(如何使用hibernate 的二级缓存坛子上也有介绍)。由此可见不同的页面的缓存策略有可能有天壤之别。

本文的目的就是上面所讲的两种情况之一,页面缓存。毫无疑问,几乎所有的网站的首页都是访问率最高的,而首页上的数据来源又是非常广泛的,大多数来自不同的对象,而且有可能来自不同的db ,所以给首页做缓存是一个不错的主意,那么主页的缓存策略是什么样子的呢,我认为应该是某个固定时间之内不变的,比如说2 分钟更新一次。那么这个缓存应该做在什么地方呢,让我们来看一下,假设您的应用的结构是page-filter-action-service-dao-db ,这个过程中的- 的地方都是可以做缓存的地方,根据页面缓存的特征,应该把页面缓存做到尽量靠近客户的地方,就是在page 和filter 之间,这样的优点就是第一个用户请求之后,页面被缓存,第二个用户再来请求的时候,走到filter 这个请求就结束了,无需再走后面的action-service-dao-db 。带来的好处是服务器压力的减低和客户段页面响应速度的加快。

那么我们来看一下如何使用ehcache 做到这一点。

在使用ehcache 的页面缓存之前,我们必须要了解ehcache 的几个概念,

1 timeToIdleSeconds ,多长时间不访问该缓存,那么ehcache 就会清除该缓存。

2 timeToLiveSeconds ,缓存的存活时间,从开始创建的时间算起。

看到这里,我们知道,首页的页面缓存的存活时间,我们定的是2 分钟,那么也就是说我们的timeToLiveSeconds 应该设置为120 ,同时我们的timeToIdleSeconds 最好也设置为2 分钟,或者小于2 分钟。我们来看一下下面这个配置,这个配置片段应该放到ehcache.xml 中:

< cache  name = "SimplePageCachingFilter"

maxElementsInMemory = "10"

maxElementsOnDisk = "10"

eternal = "false"

overflowToDisk = "true"

diskSpoolBufferSizeMB = "20"

timeToIdleSeconds = "10"

timeToLiveSeconds = "10"

memoryStoreEvictionPolicy = "LFU"

/>

SimplePageCachingFilter 是缓存的名字,maxElementsInMemory 表示内存中SimplePageCachingFilter 缓存中元素的最大数量为10 ,maxElementsOnDisk 是指持久化该缓存的元素到硬盘上的最大数量也为10 (),eternal=false 意味着该缓存会死亡。overflowToDisk=true 意思是表示当缓存中元素的数量超过限制时,就把这些元素持久化到硬盘,如果overflowToDisk 是false ,那么maxElementsOnDisk 的设置就没有什么意义了。memoryStoreEvictionPolicy=LFU 是指按照缓存的hit 值来清除,也就是说缓存满了之后,新的对象需要缓存时,将会将缓存中hit 值最小的对象清除出缓存,给新的对象腾出地方来了(文章最后有ehcache 中自带的3 种缓存清空策略的介绍)。

接着我们来看一下SimplePageCachingFilter 的配置,

< filter >

< filter-name > indexCacheFilter filter-name >

< filter-class >

net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter

filter-class >

filter >

< filter-mapping >

< filter-name > indexCacheFilter filter-name >

< url-pattern > *index.action url-pattern >

filter-mapping >

就只需要这么多步骤,我们就可以给某个页面做一个缓存的,把上面这段配置放到你的web.xml 中,那么当你打开首页的时候,你会发现,2 分钟才会有一堆sql 语句出现在控制台上。当然你也可以调成5 分钟,总之一切都在控制中。

好了,缓存整个页面看上去是非常的简单,甚至都不需要写一行代码,只需要几行配置就行了,够简单吧,虽然看上去简单,但是事实上内部实现却不简单哦,有兴趣的话,大家可以看看SimplePageCachingFilter 继承体系的源代码。

上面的配置针对的情况是缓存首页的全部,如果你只想缓存首页的部分内容时,你需要使用SimplePageFragmentCachingFilter 这个filter 。我们看一下如下片断:

< filter >

< filter-name > indexCacheFilter filter-name >

< filter-class >

net.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilter

filter-class >

filter >

< filter-mapping >

< filter-name > indexCacheFilter filter-name >

< url-pattern > */index_right.jsp url-pattern >

filter-mapping >

这个jsp 需要被jsp:include 到其他页面,这样就做到的局部页面的缓存。这一点貌似没有oscache 的tag 好用。

事实上在cachefilter 中还有一个特性,就是gzip ,也就是说缓存中的元素是被压缩过的,如果客户浏览器支持压缩的话,filter 会直接返回压缩过的流,这样节省了带宽,把解压的工作交给了客户浏览器,如果客户的浏览器不支持gzip ,那么filter 会把缓存的元素拿出来解压后再返回给客户浏览器(大多数爬虫是不支持gzip 的,所以filter 也会解压后再返回流),这样做的优点是节省带宽,缺点就是增加了客户浏览器的负担(但是我觉得对当代的计算机而言,这个负担微乎其微)。

好了,如果你的页面正好也需要用到页面缓存,不防可以考虑一下ehcache ,因为它实在是非常简单,而且易用。

总结:ehcache 是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,目前的最新版本是1.3 ,而且是hibernate 默认的缓存provider 。虽然本文是介绍的是ehcache 对页面缓存的支持,但是ehcache 的功能远不止如此,当然要使用好缓存,对JEE 中缓存的原理,使用范围,适用场景等等都需要有比较深刻的理解,这样才能用好缓存,用对缓存。

最后复习一下ehcache 中缓存的3 种清空策略:

1 FIFO ,first in first out ,这个是大家最熟的,先进先出,不多讲了

2 LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面所讲,缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。

2 LRU ,Least Recently Used ,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

转载于:https://my.oschina.net/farces/blog/280598

细谈Ehcache页面缓存的使用相关推荐

  1. SpringBoot+EHcache实现缓存

    撰文背景 公司开发中的一个驱动模块,需要用到本地缓存,来提高驱动模块的访问速度和性能,然后就想到了Ehcache缓存,Ehcache是Hibernate 中默认的CacheProvider,hiber ...

  2. 页面缓存 ehcache(简单的)

    今天有空学习下页面缓存,我的例子是最简单的...: 1.下载ehcache-core  ehcache-web jar包. 2.web.xml: <filter> <filter-n ...

  3. windows server 2003 DNS 细谈系列之(二)记录类型、数据库

    windows server 2003 DNS 细谈系列之(二)记录类型.数据库<?xml:namespace prefix = o ns = "urn:schemas-microso ...

  4. EhCache 分布式缓存/缓存集群

    开发环境: System:Windows JavaEE Server:tomcat5.0.2.8.tomcat6 JavaSDK: jdk6+ IDE:eclipse.MyEclipse 6.6 开发 ...

  5. Ehcache分布式缓存及测试方法

    接到配合架构部要求配合测试需求,对EhCache 进行测试,在此之前,未接触过ehcache缓存,之前知道一些缓存,但是还真没了解过内存缓存.于是百度,看书,查资料,先恶补一下ehcache的一些知识 ...

  6. 细谈getRequestDispatcher()与sendRedirect()的区别

    问题?细谈getRequestDispatcher()与sendRedirect()的区别 首先我们要知道: (1)request.getRequestDispatcher()是请求转发,前后页面共享 ...

  7. html网页制作之细谈HTML前端项目开发过程中的细节及心得_避免入坑

    细谈两类前端项目与编写过程中的技巧.心得 快乐的五一小长假,由于回家路途遥远,只好自己在校编前端网页.两天多的时间编写了两种不同风格的网页,人都敲傻了,还好只涉及到了HTML和CSS,并未加入JS模块 ...

  8. 细谈网络同步在游戏历史中的发展变化(中)

    非常不好意思让大家久等了,上一篇文章细谈网络同步在游戏历史中的发展变化(上)我们讨论了网络同步的基本概念以及锁步同步(帧同步)的发展历史,这篇我们继续讲述状态同步的发展历程与基本原理.本文作者依旧是网 ...

  9. ajax机制 缓存,浅谈Ajax的缓存机制

    浅谈Ajax的缓存机制 Ajax的缓存机制和浏览器处理资源时的缓存机制是一样的. 三条简单规则: 只要是URL相同的GET请求,浏览器会使用缓存(当然还要看服务器的Cache-Control/Expi ...

最新文章

  1. 字符串专题:map POJ 1002
  2. Wannafly挑战赛3
  3. mybatis框架--学习笔记(上)
  4. zookeeper的名词复盘-版本-保证分布式数据原子性
  5. 深入解析Java字节码和字节码操作类库ASM源码解析
  6. java测试netty_《Netty官方文档》基准测试
  7. C++|Qt工作笔记-C++获取当前系统时间,Qt获取当前系统时间及各标准间转化
  8. java回调函数(全干货)
  9. 格力宣布11月11日一天让利7亿元 全场空调最高降3900元
  10. conda 安装指定版本tensorflow cpu/gpu
  11. .net平台下的手机在线wap网站模拟器(附源代码)
  12. SPSS 27 发布了!我为什么要在两个月前买SPSS?为什么?为什么?为什么?
  13. win10记得pin码 重置密码登录
  14. Swift 数组遍历 ForEach .enumerated() makeIterator() indices
  15. Windows 7装机必备 - 主流品牌驱动大集合
  16. android记账本折线图_Android Studio——记账本以及图表可视化实现
  17. 会说话的TOM猫的原理是什么
  18. 开关电源设计时如何减小地弹
  19. 浅谈对transforms.ToTensor()和transforms.Normalize()函数的理解
  20. #2002 SIGSEGV(SEGV_MAPERR)

热门文章

  1. Hibernate随机获取指定范围内的指定条目的记录
  2. 爱情麻辣烫防骗子—骗子谎称学生出事让家长汇款
  3. IBATISNETNET 1.3 开发指南系列文章
  4. 通用的异步处理类和进度通知类及其示例
  5. php 图片路径混淆,爬虫遇到了字符图片混淆。pytesseract识别图片字符
  6. 上一页下一页_Excel打印时一页放不下,4招轻松搞定,省下的纸叫老板加工资
  7. synchronized同步方法
  8. 实现Redis用户会话 - 1
  9. 并发工具类纵览——建立起Java并发体系的大厦
  10. 搭建elasticsearch测试工程