网站出现弹窗,淘宝客推广有效果吗,运营商网站服务密码,国内知名软件开发公司展开全部1.技术背景#xff1a;系统缓存是32313133353236313431303231363533e4b893e5b19e31333337396236位于应用程序与物理数据源之间#xff0c;用于临时存放复制数据的内存区域#xff0c;目的是为减少应用程序对物理数据源访问的次数#xff0c;从而提高应用程序的运行…展开全部1.技术背景系统缓存是32313133353236313431303231363533e4b893e5b19e31333337396236位于应用程序与物理数据源之间用于临时存放复制数据的内存区域目的是为减少应用程序对物理数据源访问的次数从而提高应用程序的运行性能。缓存设想内存是有限的缓存的时效性也是有限的所以可以设定内存数量的大小可以执行失效算法可以在内存满了的情况下按照最少访问等算法将缓存直接移除或切换到硬盘上。Ehcache从Hibernate发展而来逐渐涵盖了Cache界的全部功能是目前发展势头最好的一个项目具有快速、简单、低消耗、扩展性强、支持对象或序列化缓存支持缓存或元素的失效提供LRU、LFU和FIFO缓存策略支持内存缓存和硬盘缓存和分布式缓存机制等特点。其中Cache的存储方式为内存或磁盘(ps无须担心容量问题)2.EhCahe的类层次介绍主要分为三层最上层是CacheManager它是操作Ehcache的入口。可以通过CacheManager.getInstance()获得一个单子的CacheManager或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManger都管理多个Cache。每个Cache都以一种类Hash的方式关联多个Element。Element就是我们用于存放缓存内容的地方。3.环境搭建很简单只需要将ehcache-2.1.0-distribution.tar.gz和ehcache-web-2.0.2-distribution.tar.gz挤压的jar包放入WEB-INF/lib下。再创建一个重要的配置文件ehcache.xml可以从ehcache组件包中拷贝一个也可以自己建立一个需要放到classpath下一般放于/WEB-INF/classed/ehcache.xml具体的配置文件可以网上搜一下4.实际运用一个网站的首页估计是被访问次数最多的我们可以考虑给首页做一个页面缓存缓存策略应该是某个固定时间之内不变的比如说2分钟更新一次以应用结构page-filter-action-service-dao-db为例。位置页面缓存做到尽量靠近客户的地方就是在page和filter之间这样的优点就是第一个用户请求后页面被缓存第二个用户在请求走到filter这个请求就结束了需要在走到action-service-dao-db好处当然是服务器压力大大降低和客户端页面响应速度加快。首页页面缓存存活时间定为2分钟也就是参数timeToLiveSeconds(缓存的存活时间)应该设置为120同时timeToIdleSeconds(多长时间不访问缓存就清楚该缓存)最好也设为2分钟或者小于2分钟。接着我们来看一下SimplePageCachingFilter 的配置indexCacheFilterfilter-namenet.sf.ehcache.constructs.web.filter.SimplePageCachingFilterindexCacheFilterfilter-name*index.actionurl-pattern将上述代码加入到web.xml那么当打开首页时你会发现2分钟才会有一堆sql语句出现在控制台也可以调整为5分钟总之一切尽在掌控之中。当然如果你像缓存首页的部分内容时你需要使用SimplePageFragmentCachingFilter这个filter我看一下indexCacheFilterfilter-namenet.sf.ehcache.constructs.web.filter.SimplePageFragmentCachingFilterfilterindexCacheFilterfilter-name*/index_right.jsp如此我们将jsp页面通过jspinclude到其他页面这样就做到了页面局部缓存的效果这一点貌似没有oscache的tag好用。此外cachefilter中还有一个特性就是gzip也就是缓存中的元素是被压缩过的如果客户端浏览器支持压缩的话filter会直接返回压缩过的流这样节省了带宽把解压的工作交给了客户端浏览即可当然如果客户端不支持gzip那么filter会把缓存的元素拿出来解压后在返回给客户端浏览器(大多数爬虫是不支持gzip的所以filter也会解压后在返回流)。总之Ehcache是一个非常轻量级的缓存实现而且从1.2之后支持了集群而且是hibernate默认的缓存provider本文主要介绍Ehcahe对页面缓存的支持但是它的功能远不止如此要用好缓存对J2ee中缓存的原理、适用范围、适用场景等等都需要比较深刻的理解这样才能用好用对缓存。为了大家通过实际例子加深了解与场景运用在奉献一个实例*在Spring中运用EhCache适用任意一个现有开源Cache Framework要求可以Cache系统中service或者DAO层的get/find等方法返回结果如果数据更新(适用了Create/update/delete)则刷新cache中相应的内容。根据需求计划适用Spring AOPenCache来实现这个功能采用ehCache原因之一就是Spring提供了enCache的支持至于为何仅仅支持ehcache而不支持oscache和jbosscache就无从得知了。AOP少不了拦截器先创建一个实现了MethodInterceptor接口的拦截器用来拦截Service/DAO的方法调用拦截到方法后搜索该方法的结果在cache中是否存在如果存在返回cache中结果如果不存在返回数据库查询结果并将结果返回到缓存。public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean{private static final Log logger LogFactory.getLog(MethodCacheInterceptor.class);private Cache cache;public void setCache(Cache cache) {this.cache cache;}public MethodCacheInterceptor() {super();}/*** 拦截Service/DAO 的方法并查找该结果是否存在如果存在就返回cache 中的值* 否则返回数据库查询结果并将查询结果放入cache*/public Object invoke(MethodInvocation invocation) throws Throwable {String targetName invocation.getThis().getClass().getName();String methodName invocation.getMethod().getName();Object[] arguments invocation.getArguments();Object result;logger.debug(Find object from cache is cache.getName());String cacheKey getCacheKey(targetName, methodName, arguments);Element element cache.get(cacheKey);Page 13 of 26if (element null) {logger.debug(Hold up method , Get method result and create cache........!);result invocation.proceed();element new Element(cacheKey, (Serializable) result);cache.put(element);}return element.getValue();}/*** 获得cache key 的方法cache key 是Cache 中一个Element 的唯一标识* cache key 包括包名类名方法名如com.co.cache.service.UserServiceImpl.getAllUser*/private String getCacheKey(String targetName, String methodName, Object[] arguments) {StringBuffer sb new StringBuffer();sb.append(targetName).append(.).append(methodName);if ((arguments ! null) (arguments.length ! 0)) {for (int i 0; i sb.append(.).append(arguments[i]);}}return sb.toString();}/*** implement InitializingBean检查cache 是否为空*/public void afterPropertiesSet() throws Exception {Assert.notNull(cache, Need a cache. Please use setCache(Cache) create it.);}}上面的代码可以看到在方法invoke中完成了搜索cache/新建cache的功能随后再建立一个拦截器MethodCacheAfterAdvice作用是在用户进行create/update/delete操作时来刷新、remove相关cache内容这个拦截器需要实现AfterRetruningAdvice接口将会在所拦截的方法执行后执行在afterReturning(object arg0Method arg1Object[] arg2,object arg3)方法中所预定的操作public class MethodCacheAfterAdvice implements AfterReturningAdvice, InitializingBean{private static final Log logger LogFactory.getLog(MethodCacheAfterAdvice.class);private Cache cache;Page 15 of 26public void setCache(Cache cache) {this.cache cache;}public MethodCacheAfterAdvice() {super();}public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throwsThrowable {String className arg3.getClass().getName();List list cache.getKeys();for(int i 0;iString cacheKey String.valueOf(list.get(i));if(cacheKey.startsWith(className)){cache.remove(cacheKey);logger.debug(remove cache cacheKey);}}}public void afterPropertiesSet() throws Exception {Assert.notNull(cache, Need a cache. Please use setCache(Cache) create it.);}}该方法获取目标class的全名如com.co.cache.test.TestServiceImpl然后循环cache的key list刷新/remove cache中所有和该class相关的element。接着就是配置encache的属性如最大缓存数量、cache刷新的时间等等。maxElementsInMemory1000eternalfalsetimeToIdleSeconds120timeToLiveSeconds120overflowToDisktrue/maxElementsInMemory10000eternalfalsetimeToIdleSeconds300000timeToLiveSeconds600000overflowToDisktrue/这里需要注意的是defaultCache定义了一个默认的cache这个Cache不能删除否则会抛出No default cache is configured异常。另外由于使用拦截器来刷新Cache内容因此在定义cache生命周期时可以定义较大的数值timeToIdleSeconds30000000,timeToLiveSeconds6000000好像还不够大然后再将Cache和两个拦截器配置到Spring的配置文件cache.xml中即可需要创建两个“切入点”分别用于拦截不同方法名的方法。在配置application.xml并且导入cache.xml。这样一个简单的SpringEncache框架就搭建完成。