当前位置:文档之家› ehcache原理

ehcache原理

ehcache原理
ehcache原理

转ehcache 基本原理

hjp222发表于2011-03-22 16:30 最后修改于2011-05-16 15:32 浏览(105) 评论(0)分类:ehcache 举报

ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache 提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他开源系统。

Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。

ehcache的刷新策略

ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较

ehcache缓存的3种清空策略:

1 FIFO,先进先出

2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。

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

可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。

可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。

ehcache参数配置:

maxInMemory - 设定内存中创建对象的最大值。

eternal - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。

timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用)。

如果该值是0 就意味着元素可以停顿无穷长的时间。

timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。

overflowToDisk - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。

1.ehcache使用了LinkedHashMap来存放Element。jdk要1.5以上。Ehcache1.5可以使用

jdk1.4

2.如果在添加Elemtent时,缓存中的Element个数达到了最大缓存数并且overflowToDisk

配置的属性为true,Ehcache会更具配置项MemoryStoreEvictionPolicy的失效策略将Element输出到磁盘。如果overflowToDisk为fasle,Ehcache将删除内存中Element

3.值得注意的是缓存中失效的Element并不会别马上清理掉,所以想得到内存的真实大小

应该调用方法calculateInMemorySize()方法。

4.一个ehcache.xml对应一个CacheManager

5.不同的缓存应该对应不同的硬盘上的路径,否则会报错

6.注意要想使用磁盘缓存,缓存的Element必须实现序列化接口。否则会抛出

NotSerializableException异常。

7.Ehcache会将每个缓存配置的文件路径下创建一个cache_name.data文件,如果使用的

磁盘持久化技术,还会生成一个cache name.index文件。

8.Ehcache有一个后台线程专门做Ellment失效监测以及清除工作。设置线程运行间隔时间,

可通过设置diskExpiryThreadIntervalSeconds属性来完成,此值不宜设置过低,否则会导致清理线程占用大量CPU资源。默认值是120秒。

9.持久化可在Element的diskPersistent配置项中配置,如果配置为“false”或是“omitted”

在CacheManager shutdown或是startup后,用来缓存Element的文件将被清除掉。如果设置为“true”,data和index文件会被保存下来,对于新创建的CacheManager Element 也是可用的。

10.使用时必须显示调用cache. Flush()才会将数据缓存到磁盘中。

11.磁盘缓存步骤:从MemoryStore中把没有失效的Element刷新到DiskStore,Element被

写入到data文件,Element将被序列化到index文件。

12.磁盘缓存大小默认是没有限制的,不过可通过maxElementsOnDisk来指定。当磁盘缓存

达到maxElementsOnDisk指定的值时,Ehcache会清理磁盘中的缓存使用默认策略是LFU (使用频率最低)。

13.在使用完Ehcache后,必须要shutdown缓存。Ehcache中有自己的关闭机制,不过最好

在你的代码中显示调用CacheManager.getInstance().shutdown();

14.Cache:对于getValue()能取到可序列化的值;getObjectValue()取得非序列化的值

15.cache.getSize();得到缓存中元素的个数;获得当前MemoryStore中的element数量:

cache.getMemoryStoreSize();获得当前DiskStore中element数量:cache.getDiskStoreSize();

16.在使用完Ehcache后,必须要shutdown缓存。Ehcache中有自己的关闭机制,不过最好

在你的代码中显示调用CacheManager.getInstance().shutdown();

17.ehcache-core-1.6—1.7没有任何依赖;ehcache1.7.1依赖SLF4J,以及相应的log的jar包。

18.CacheManager可以通过单例(factory的静态方法)或者构造函数(constructors)创建。

分别叫做single model和instance model。当两种情况都有的时候,系统会采用单例模式,构造器每次都生成单例模式

19.对于想存储数据到硬盘,或者集群时复制到其他缓存区域的数据,必须可序列化。如果

不可序列化,该数据在进行上述操作时会被丢弃,且没有报错,只是在debug级别有日志信息。

20.读取cache的数据,有以下几种方式:

Cache-aside: 直接操作数据

Cache-as-sor:read-through、write-through和write-behind的结合

Read-through:

Write-through:

Write-behind:

21.从ehcache2.0开始,以下属性可以在运行时改变:

? timeToLive

? timeToIdle

? maxElementsInMemory

? maxElementsOnDisk

? memory store eviciton policy

? CacheEventListeners can be added and removed dynamically []

当eternal属性为“true”时,timeToLive和timeToIdle会失效

22.以下代码演示怎么运行时修改缓存属性

This example shows how to dynamically modify the cache configuration of an already

running cache:

Cache cache = manager.getCache("sampleCache");

CacheConfiguration config = cache.getCacheConfiguration();

config.setTimeToIdleSeconds(60);

config.setTimeToLiveSeconds(120);

config.setMaxElementsInMemory(10000);

config.setMaxElementsOnDisk(1000000);

Dynamic cache configurations can also be frozen to prevent future changes:

Cache cache = manager.getCache("sampleCache");

cache.disableDynamicFeatures();

23.2.5之前是通过元素的个数来表示内存或者硬盘的大小;2.5之后,通过字节数来表示。

2.5暂时还没有出来。新属性将会是:

The new cache attributes are:

? maxBytesOnHeap

? maxBytesOffHeap (formerly maxMemoryOffHeap)

? maxBytesOnDisk

甚至,还可以指定比例,如:maxBytesOnHeap="20%".

24.Ehcache可以将一些数据一直放到缓存或者堆栈或者硬盘或者terracotta的L2中。主要

是为了满足Hibernate等一些情况下的需求。但是,这样很容易造成内存溢出的错误25.当缓存刚启动时,ehcache提供一个机制可以先加载数据:BootstrapCacheLoader

class="net.sf.ehcache.distribution.jgroups.JGroupsBootstrapCacheLoaderFactory"

properties="bootstrapAsynchronously=true"/>

DiskStoreBootstrapCacheLoaderFactory:从硬盘加载数据到堆栈

class="net.sf.ehcache.store.DiskStoreBootstrapCacheLoaderFactory"

properties="bootstrapAsynchronously=true"/>

TerracottaBootstrapCacheLoaderFactory:从terracotta的L2中加载数据

class="net.sf.ehcache.store.TerracottaStoreBootstrapCacheLoaderFactory"

properties="bootstrapAsynchronously=true"/>

26.可以配置ehcache在读或者写的时候,做些事情。

CacheConfiguration config = new CacheConfiguration("copyCache",

1000).copyOnRead(true)

Cache copyCache = new Cache(config);

默认此属性是false。

maxElementsInMemory="10"

eternal="false"

timeToIdleSeconds="5"

timeToLiveSeconds="10"

overflowToDisk="false"

copyOnRead="true"

copyOnWrite="true">

27.每一个cache都有一个copyStrategy,所以,该实现是要求线程安全的

在ehcache启动的时候,可以设置缓存失效。命令行启动的时候如下:

java -Dnet.sf.ehcache.disabled=true

其他特殊的系统属性:

1)java https://www.doczj.com/doc/3b15820181.html,e.classic.lru=true

当LRU被选中的时候,更老的LruMemoryStore实现策略将会被真正采用

28.ehcache.xml必须遵守ehcache.xsd文件中的要求

29.当无参的构造函数,或者静态构造方法被调用的时候,系统会在最顶层的classpath路

径下找名叫ehcache.xml的配置文件,如果查找失败,会以jar包中的ehcache-failsafe.xml文件(里边的缓存配置极其简单)替代。同时,一个警告会提醒用户建立自己的配置文件。

30.Update checker可以检查是否有最新的ehcache版本。有两个办法可以去掉该功能:

1)通过系统参数:-Dnet.sf.ehcache.skipUpdateCheck=true

2)通过配置文件:

xsi:noNamespaceSchemaLocation="ehcache.xsd"

updateCheck="false" monitoring="autodetect"

dynamicConfig="true">

31.Ehcache1.6之前只支持ASCII编码,之后,UTF-8也被支持。但UTF-8比ASCII更多落后,

所以没必要做专门的转换

32.每一个Cachemanager应该有自己的独有的ehcache.xml配置文件。因为,当共用时,

硬盘缓存路径或者监听端口将会冲突。系统也会发出警告,提醒用户配置专门的配置文件为每一个cachemanager.在分布式系统中,ehcache.xml应该配置成一样的。

33.Ehcache有3个存储:

1)内存存储

2)非堆存储(大内存,企业ehcache才拥有)

3)硬盘存储(两个版本:开源的和企业级ehcache)

34.内存存储

其本质是使用java的LinkedHashMap来实现的。多线程安全、内存管理安全、速度快35.calculateInMemorySize()可以用来计算当前ehcache内存占用大小。但生产线上不应该使

用,因为这个功能效率非常低

36.同时,ehcache内部有一个低等级的进程,它会判断元素的是否过期。

diskExpiryThreadIntervalSeconds属性可以设置该线程执行的间隔时间(默认是120秒,不能太小,以免影响效率).

37.非堆存储

Terracotta BigMemory是一个新增的功能,它允许系统占用堆以外的内存,速度是硬盘存储的100倍,允许很大的存储空间被创建(350G被测试过)

因为非堆数据是以字节流的形式存储,所以要求Element的key和value都要是可以序列化的。

因为序列化和反序列化的过程,这种存储形式比内存存储慢10倍

38.硬盘存储

线程安全的

39.当maxElementsOnDisk被设置的时候,硬盘上的存储达到限制时,LFU算法会被执行用

于清除数据,只能是该算法,不可配置

40.Persistence被设置成false或者omitted,当系统重启时,不会硬盘的数据存储在硬盘

上,.data文件将会被删除.相反,.data文件不会被删除,下次重启后Cachemanager还可以使用.data文件。

41.虚拟机被停止的时候,强烈建议调用Cachemanager.shutdown()方法。

42.在关闭java虚拟机时,系统执行以下步骤:

Considerations for guidance on how to safely shut the Virtual Machine down.

When a DiskStore is persisted, the following steps take place:

? Any non-expired Elements of the MemoryStore are flushed to the DiskStore

? Elements awaiting spooling are spooled to the data file

? The free list and element list are serialized to the index file

On startup the following steps take place:

? An attempt is made to read the index file. If it d oes not exist or cannot be read

successfully, due to disk corruption, upgrade of ehcache, change in JDK version etc, then the data file is deleted and the DiskStore starts with no Elements in it.

? If the index file is read successfully, the free list and element list are loaded into

memory. Once this is done, the index file contents are removed. This way, if there is a dirty shutdown, when restarted, Ehcache will delete the dirt index and data files.

? The DiskStore starts. All data is available.

? The expiry thread starts. It will delete Elements which have expired.

43.一个示范性地配置:

把一个拥有8G机器内存的存储分配成各种存储。设想有一个7G的数据集,共7M个元素,每个元素1k大小。

我们设置1G的堆存储和7G的非堆存储:

java -Xms1G -Xmx1G -XX:maxDirectMemorySize=7G

对应的配置文件为:

maxElementsInMemory=100

overflowToOffHeap="true"

maxMemoryOffHeap="7G"

... />

44.对于第二种集群方法,以下服务器被测试过:

? Glassfish V2/V3

? Tomcat 6

? Jetty 6

Tomcat 6通过了所有的继集成测试

支持Weblogic10.3.2,但是SOAP不兼容。

45.最大的Ehcache单实例在内存中可以缓存20GB,最大的磁盘可以缓存100GB

46.关于ehcache server的相关命令用法在user guide的178页

47.

缓存属性:

缓存配置。

以下属性是必须的:

name - cache的标识符,在一个CacheManager中必须唯一

maxElementsInMemory - 在内存中缓存的element的最大数目

maxElementsOnDisk - 在磁盘上缓存的element的最大数目

eternal - 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略

overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上

以下属性是可选的:

timeToIdleSeconds - 缓存element在过期前的空闲时间。默认为0,表示可空闲无限时间. (如果指定了这个时间,是否在被hit的前超过了这个时间就会被remove?在内存缓存数目超限之前不会被remove)

timeToLiveSeconds - 缓存element的有效生命期。这个类似于timeouts,默认为0,不过期(是否通常情况下应该大于等于timeToIdleSeconds,小于会如何?idle时间也会减小和这个数值一样)

diskPersistent - 在VM重启的时候是否持久化磁盘缓存,默认是false。

(测试一下true的情况?重载vm的时候会从磁盘进行序列化到对象)

diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒. (测试一下0的时候会如何)

memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候,移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO可对缓存中的element配置诸如监听器和加载器。Ehcahe内建了一些

*cacheEventListenerFactory - 监听缓存中element的put, remove, update和expire事件*bootstrapCacheLoaderFactory - 启动时加载缓存的element每个用来做分布式缓存都必须设定element的事件监听器,用来在各个CacheManager节点复制消息。

Ehcache内建了基于RMI的实现 - RMICacheReplicatorFactory

Ehcache 2 缓存区配置详解

Ehcache 2 缓存区配置详解 第1章Ehcache简介 EhCache是一个开放源码的,基于标准的高速缓存系统。Ehcache可以显著提高应用性能,降低数据库负载,简化应用扩展。Ehcache健壮、功能齐全,也历经了众多应用考验,使得它成为使用最广泛的基于Java的缓存系统。 Ehcache可以支持从进程内的一个或多个节点的部署方式到进程内与进程外混合、高达TB 大小的高速缓存。 Ehcache目前由Terracotta公司维护,使用Apache 2 许可证。 Ehcache截止目前最新版本为2.6。支持多种方式缓存: ●Standalone模式。嵌入应用进程内。单点,多节点间无沟通。 ●Replication模式。嵌入应用内部,通过RMI或JGroup或JMS进行节点同步。 ●Cache Server模式。作为独立缓存服务器,提供REST与WebService接口供访 问。 ●Distributed Caching模式。采用Terracotta Server Array实现高可用的分布式 缓存。 Standalone与Replication均是较传统的使用方式,很多场景下难以满足动态基础设施环境下应用弹性的要求。Cache Server使得缓存服务可以容易的进行水平扩展,但是基于REST与WebService的访问方式降低了缓存访问的效率,不太适合对缓存实时性要求较高的场景。Distributed Caching模式提供了进程内与进程间缓存较理想的结合模式,支持水平扩展,高可用,对网络依赖程度较低,可以很好适应应用弹性伸缩,是动态基础设施条件下较理想的缓存模式。 第2章Ehcache 2 缓存区配置 Ehcache默认配置文件在Ehcache客户端的classpath根目录下,名为ehcache.xml。典型的配置文件如下:

spring配置文件各个属性详解

spring配置文件各个属性详解 分类:spring 2012-08-09 11:25 9316人阅读评论(2) 收藏举报springaophibernateattributesxhtmlwebsphere 目录(?)[+]一、引用外部属性文件 classpath:mail.properties classpath:jdbc.properties 我们定义了一个PropertyPlaceholderConfigurer类的实例,并将其位置属性设置为我们的属性文件。该类被实现为Bean工厂的后处理器,并将使用定义在文件中的属性来代替所有的占位符(${...}value)。 注意: 而在spring2.5的版本中提供了一种更简便的方式,如: 1. 这样以后要使用属性文件中的资源时,可以使用${属性名}来获得。 二、常用数据源的配置 第一种是:DBCP数据源,(需要加入2个jar文件,在spring中的lib下 jakarta-commons/commons-dbcp.jar和commons-pools.jar)主要配置如下:

Spring下Ehcache缓存的配置文档说明

Ehcache缓存单机环境配置 以下的配置是针对DAO层而言的,Controller层不需要做配置。 步骤一:配置pom.xml文件 在文件中引入以下几个依赖项: com.googlecode.ehcache spring-annotations-osgi 1.1.2 commons-codec commons-codec 1.4 net.sourceforge.ehcache https://www.doczj.com/doc/3b15820181.html,.sf.ehcache 2.2.0 步骤二:配置template.mf 在”Import-Package”之后”Excluded-Exports”之前引入三条配置项,注意包名之前要留一个空格,如下红色字体显示部分: Import-Package: org.springframework.context.config;version="[3.0.5,4)", com.googlecode.ehcache.annotations;version="1.1.0", com.googlecode.ehcache.annotations.key;version="1.1.0", org.springframework.aop.aspectj.autoproxy Excluded-Exports: com.mpr.mprsp.mcrc.service.mcrs.publisher.internal.* 步骤三:配置Spring的配置文件applicationContext.xml: 首先在文件的头部加上ehcache的dtd声明,然后配置ehcache缓存管理器。具体配置如下红色字体所示:

她直到6点才到。 until 用法上的三个难点 一、 1. until用在肯定句,谓语动词通常是延续性动词,如stand, stay, talk, wait等,表示主句动作终止的时间。如: ③I waited until he cam e back.我一直等到他回来。 ④The war lasted until 1945.战争持续到1945年。 如果用在否定句,谓语动词通常是瞬间性动词,如open, start, leave, arrive, finish, stop等,强调主句动作开始的时间。如: ⑤I didnt leave the boy until his mother turned up.直到这孩子的母亲来,我才离开。 ⑥The noise of the street didnt stop until it wa s midnight.街上的噪音直到半夜才停止。 2.连词until引导的从句中谓语动词的时态 1)until后面的从句中不能用一般将来时,应该用一般现在时代替。所谓的“主将从现”。 He will stay here until his mother comes back.

EHCache介绍

EHCache介绍 简介 系统缓存是位于应用程序与物理数据源之间,用于临时存放复制数据的内存区域,目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能. 缓存设想内存是有限的,缓存的时效性也是有限的,所以可以设定内存数量的大小,可以执行失效算法,可以在内存满了的时候,按照最少访问等算法将缓存直接移除或切换到硬盘上。 Ehcache从Hibernate发展而来,逐渐涵盖了Cahce界的全部功能,是目前发展势头最好的一个项目。具有快速,简单,低消耗,依赖性小,扩展性强,支持对象或序列化缓存,支持缓存或元素的失效,提供LRU、LFU 和FIFO缓存策略,支持内存缓存和磁盘缓存,分布式缓存机制等等特点。 2009年8月Terracotta公司并购了开源缓存项目Ehcache, Terracotta 公司的产品 Terracotta 是一个 JVM 级的开源群集框架,提供 HTTP Session 复制、散布式缓存、POJO 群集、跨越集群的JVM 来完成散布式使用顺序协调。并购后EhCache 首要的改进都集中在跟Terracotta 框架的集成上,这是一个真实意义上的企业级缓存处置方案。Ehcache1.7版本上首次加入了ehcache-terracotta组件模块,想利用terracotta来实现更方便的集群操作。 Overview Ehcache是一个开源的,用于提高访问性能的标准高速缓存,它抛弃了数据库同时易于扩展。Ehcache拥用强大的,可靠和完整的功能,这已成为最广泛使用的基于Java的高速缓存。 Ehcache可以实现TB级的高速缓存管理,可配置多个缓存节点。对于需要互联的分布式缓存应用,Ehcache的使用开源的Terracotta Sever的阵列。 Ehcache是Terracotta公司的一个长期开发、维护和支持的专业开源项目。有效基于Apache 2 license。除了开源的ehcache,Terracotta公司还提供企业版的Ehcache全天候的专业支持,咨询和培训。

[实用参考]代码说明文档.doc

简介FHQ313596790 Springmvc+mybatis组合框架 Oracle和mysql俩版本 1各包说明 1.1Src 1.controller:业务处理包(日常代码维护主要包) 2.dao:增删改查的接口(无需操作,不用管它) 3.entity:实体类包(存放实体类) 4. filter:登录顾虑验证器(可以在此添加一段代码,让tomcat启动后立即自动执 行 需要配置web.Gml 5.interceptor:session有效期验证 请求的连接中GGG.do不包含login,logout,code,app 等字符的,都会被判断session存在与否,否:跳转到登录,是:跳转到相应地址 6.Listener:在web容器启动时由WebAppConteGtListener初始化 7.Plugin:分页插件(已经处理好,无需更改)

8.Listene:MyEGceptionResolver异常处理 9.Util所有工具类(发邮件,发短信,日期格式化等) 1.2resources 1.mybatis:对应的配置文件 2.spring:spring的配置文件ApplicationConteGt.Gml 3.log4j日志处理配置,可设置生成日志文件到硬盘的某个目录下 4.dbconfigerties:数据库链接池配置 5.shior配置,在spring/ApplicationConteGt.Gml 1.2WebRoot admin:存放配置文件,代码生成器生成的代码(相对tomcat的目录) plugins:插件存放目录 static:jscssimg等存放目录 jsp:在WEB-INF目录下 增删改查流程 增加:(form表单提交数到后台在存入数据库) form表单action=”user/saveU.do” 1.比如新增用户,”user”对应的是

until-和-not-until-的用法

until 和 not until 的用法 六课课题语法选择题的第八题讲到了until的用法,请大家注意,until 放在句首一般不用倒装,只有not until放在句首的时候才要倒装。而时态方面,过去时和过去完成时都可以,所以AB都可以。 Until直到….为止, not until直到…才 肯定形式表示的意思是"做某事直至某时",动词必须是延续性的。 否定形式表达的意思是"直至某时才做某事"。动词为延续性或非延续性都可以。 肯定句: I slept until midnight. 我一直睡到半夜时醒了。 Wait till I call you. 等着我叫你。 (在肯定句中可用before代替Let”s get in the wheat before the sun sets.) 否定句: She didn”t arrive until 6 o”clock. 她直到6点才到。 Don”t get off the bus until it has stopped. 公共汽车停稳后再下车。 I didn”t manage to do it until you had explained how. 直到你教我后,我才会做。

否定句可用另外两种句式表示。 (1)Not until …在句首,主句用倒装。 Not until the early years of the 19th century did man know what heat is. 直到19 世纪初,人类才知道热能是什么。 Not until I began to work did I realize how much time I had wasted. 直到我开始工作,我才认识到了我已蹉跎了几多岁月。 (2) It is not until… that…这是一个强调结构。如本题。 Till的用法基本相同,但 1)Until可用于句首,而till通常不用于句首。 Until you told me, I had heard nothing of what happened. 直到你告诉我以前,出了什么事我一点也不知道。 2)Until when 疑问句中,until要放在句首。 ---Until when are you staying 你呆到什么时候 --- Until next Monday. 呆到下周一。

java应用服务器集群环境下代码编写要注意的问题

java应用服务器集群环境下代码编写关注点 J2EE架构下,软件的部署环境为集群的情况很多,所以针对集群环境的软件 开发非常重要,所以我们在编码过程中要超前思考,以免加大后期的工作量。了解集群 什么是集群: web应用服务器集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样。为了均衡集群服务器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理。从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性。 集群技术的特点 高可靠性和高可用性:通过集群技术组成的系统,可以确保数据和应用程序对最终用户的高可用性和高可靠性,也就是说当主节点上的系统崩溃时,冗余节点就从替补角色转换到正式角色,并自动投入应用,从而保证了系统运行的不间断。或者检测某一个空闲服务器,将请求分发给它,对请求进行处理,而且这一过程对用户来说,是透明的,用户察觉不到! 稳定性和可伸缩性:在系统的处理能力需要增加的时候,除了通过增加集群中每个计算机节点的单机处理能力(如通过增加CPU数量、增加内存大小等手段)外,还可以通过增加集群节点数,即通过向群集添加新的计算机节点,使服务随着处理器的添加而伸缩,从而增大应用程序吞吐量,以达到增加系统的整体处理能力的目的,完成系统的扩容。 Web应用服务器集群结构图,下面例举了weblogic和websphere集群结构图 websphere集群架构图

weblogic集群架构图 排除网络设备,由上面两幅图可以观察到,应用服务器集群包含了三部分

1.Web服务器(Web Server) Web服务器专门处理HTTP请求(request),应用的软件如Apache,IBM HTTP Server,或者自己写的代理服务等等。 2.应用程序服务器(The Application Server) 应用程序服务器是通过很多协议来为应用程序提供(serves)业务逻辑(business logic)。 3.关系数据库系统 4.消息中间件 备注:一定要清楚web服务器与应用程序服务的区别 由图我们来分析一下,集群环境下开发需要注意哪些地方? 1.Session,我们经常用session来封装用户的登录信息,那么如果集群环境下一台机器session中有,一台没用回发生什么样的情况呢?幸好各个应用服务器都有在集群环境下session复制的配置。如果配置请查阅对应的文档。另外web 开发经常用到Webwork,strut2,flex等技术,他们都对sesson的封装。他们是否也能复制呢?还要测试才行,当然理论上是可以的,呵呵!还有有的时候session 要保存到什么位置?也是个问题a)内存,b)文件c)数据库。根据实 际情况来选择吧。 2.Cache,Cache我们经常使用(我这里只说对象级缓存),如:将一些经常用到的数据缓存到内存中。这种情况下和session有些类似。有的人实例化了一个包 含HashMap的一个单例的对象,用来缓存数据,单机环境没什么问题,可是如 果是集群环境呢?会怎样?所有我们引用分布式缓存或者集中式缓存,分布式缓存有很多种如ehcache,jbosscache,oscache等,集中式缓存比较典型的就是memcached。选择分布式还是集中式根据项目的需要来定了。这里就不说了。 3.线程、定时器,如:单机环境下我们写一个单线程,如用来像其他系统上传数 据(这个数据部允许多次上传),如果程序发布在集群环境下回发生什么情况?呵呵。变成多线程了。多个计算机内的单线程同时上传数据。所以这个时候考虑的地方就很多了!!是选择故障转移还是负载均衡都是考虑的范围。定时器也雷 同。可以参考spring quartz 集群解决方案。 4.JDBC,JDBC注意的是数据库集群的情况,如weblogic集群架构图所示,编写程序时,获得JDBC链接可以这样写, Connection con = null; try {

EHCache 技术文档 缓存 spring缓存

目录 0. 文档介绍 (2) 0.1文档目的 (2) 0.2文档范围 (2) 0.3读者对象 (2) 0.4参考文献 (2) 0.5术语与缩写解释 (3) 1.概述 (4) 1.1背景 (4) 1.2主要特征 (3) 1.3环境 (5) 1.4下载资源 (5) 2. EHCACHE页面缓存的配置 (5) 2.1EHC ACHE的类层次模型 (5) 2.2环境搭建 (6) 2.3 EHCACHE配置文件中元素说明................................................... 错误!未定义书签。 2.4在工程中单独使用...................................................................... 错误!未定义书签。 3. 在SPRING中运用EHCACHE ....................................................... 错误!未定义书签。 4. 分布式缓存集群环境配置 (19) 4.1集群配置方式 (19) 5. 测试用例 (28)

0. 文档介绍 0.1 文档目的 记录使用EHCache实现页面级的缓存以及完成集群设计的过程。0.2 文档范围 记录使用EHCache实现页面级的缓存以及完成集群设计的过程。0.3 读者对象 任何有兴趣的家伙。 0.4 参考文献 提示:列出本文档的所有参考文献(可以是非正式出版物),格式如下:[标识符] 作者,文献名称,出版单位(或归属单位),日期 大部分都是网络上查询的资料,很多,不列举了。

Ehcache是现在最流行纯Java开源缓存框架

Ehcache是现在最流行的纯Java开源缓存框架 2014-12-22 13:28 37723人阅读评论(0) 收藏举报分类: java(405) c:\t _blank Ehcache是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大,最初知道它,是从hibernate的缓存开始的。网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google;对于API,官网上介绍已经非常清楚,请参见官网;但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存感兴趣的朋友有所收获。 一、特性一览,来自官网,简单翻译一下: 1、快速轻量 过去几年,诸多测试表明Ehcache是最快的Java缓存之一。 Ehcache的线程机制是为大型高并发系统设计的。 大量性能测试用例保证Ehcache在不同版本间性能表现得一致性。 很多用户都不知道他们正在用Ehcache,因为不需要什么特别的配置。 API易于使用,这就很容易部署上线和运行。 很小的jar包,Ehcache 2.2.3才668kb。 最小的依赖:唯一的依赖就是SLF4J了。 2、伸缩性 缓存在内存和磁盘存储可以伸缩到数G,Ehcache为大数据存储做过优化。 大内存的情况下,所有进程可以支持数百G的吞吐。 为高并发和大型多CPU服务器做优化。 线程安全和性能总是一对矛盾,Ehcache的线程机制设计采用了Doug Lea的想法来获得较高的性能。 单台虚拟机上支持多缓存管理器。

通过Terracotta服务器矩阵,可以伸缩到数百个节点。 3、灵活性 Ehcache 1.2具备对象API接口和可序列化API接口。 不能序列化的对象可以使用除磁盘存储外Ehcache的所有功能。 除了元素的返回方法以外,API都是统一的。只有这两个方法不一致:getObjectValue和getKeyValue。这就使得缓存对象、序列化对象来获取新的特性这个过程很简单。 支持基于Cache和基于Element的过期策略,每个Cache的存活时间都是可以设置和控制的。 提供了LRU、LFU和FIFO缓存淘汰算法,Ehcache 1.2引入了最少使用和先进先出缓存淘汰算法,构成了完整的缓存淘汰算法。 提供内存和磁盘存储,Ehcache和大多数缓存解决方案一样,提供高性能的内存和磁盘存储。 动态、运行时缓存配置,存活时间、空闲时间、内存和磁盘存放缓存的最大数目都是可以在运行时修改的。 4、标准支持 Ehcache提供了对JSR107 JCACHE API最完整的实现。因为JCACHE在发布以前,Ehcache的实现(如net.sf.jsr107cache)已经发布了。 实现JCACHE API有利于到未来其他缓存解决方案的可移植性。 Ehcache的维护者Greg Luck,正是JSR107的专家委员会委员。 5、可扩展性 监听器可以插件化。Ehcache 1.2提供了CacheManagerEventListener和CacheEventListener接口,实现可以插件化,并且可以在ehcache.xml里配置。 节点发现,冗余器和监听器都可以插件化。 分布式缓存,从Ehcache 1.2开始引入,包含了一些权衡的选项。Ehcache的团队相信没有什么是万能的配置。 实现者可以使用内建的机制或者完全自己实现,因为有完整的插件开发指南。 缓存的可扩展性可以插件化。创建你自己的缓存扩展,它可以持有一个缓存的引用,并且绑定在缓存的生命周期内。 缓存加载器可以插件化。创建你自己的缓存加载器,可以使用一些异步方法来加载数据到缓存里面。 缓存异常处理器可以插件化。创建一个异常处理器,在异常发生的时候,可以执行某些特定操作。

until与not...until...及It is not until...that...的用法详解

1.until (即是介词又是连词)要区分开哪种情况是介词及连词 介词prep. 1.直到...时,到...为止 Will this fish keep until tomorrow? 这鱼能搁到明天吗? 2.(用于否定句)在...之前,直到...才 She didn't go to bed until eleven o'clock. 她直到十一点才上床睡觉。 连接词conj. 1.直到...时,到...为止 You can wait here until help comes.你可以在这里等,直到有人来帮你。 2.(用于否定句)在...以前,直到...才 She didn't go to bed until her daughter came back. 她一直等到女儿回来才去睡觉。 You can't leave until I come back.。直到我回来你才可以离开 ■“not…until””意思是:“直到……才……”表示在这个界限之前一直没有发生这个动作 ■“直到……”表示这个动作一直延续到这个界限出现时。 ■not…until””句型翻译成了否定句,如上句:直到我回来你不可以离开×) ■wait、keep是延续性动词,所以用肯定形式;而go to bed、leave是非延续性动词,所以用否定形式。 ■用“until”还是“not…until”要看谓语动词是延续性还是非延续性动词 ■until用做连词时,要注意以下几点 not…until 到…才…”

■对not…until的强调结构为“It is / was not until…that…”虽然两者都有not进行了否定,但中文要译成肯定“直到……才……” ■It was not until yesterday that I noticed it. =I didn’t notice it until yesterday. 直到昨天我才注意到此事。 It was not until I saw Mary that I felt happy. =I didn’t feel happy until I saw Mary 直到见到玛丽我才高兴起来。 ■ ■ ■ It was _____ I went there _____ I began to know something about the matter. 直到我到那里我才了解那件事。 A. until; when B.until; that C.not until; that D.not when;that (正确为C) ①Not until the teacher came in did the students stop talking. 直到老师进来学生们才停止讲话。 ②Not until next week will the sports meet be held.直到下周才开运动会。 主句倒装时要注意以下几点: 1.主句倒装时注意主句中的谓语动词是is/are/am/was/were时,将此be动词提到主 2.句的主语前面; 3.主句中的谓语动词是实意动词,时态为现在/过去时,将do/does/did提前到主语前,完成时将have/has/had提到主语前; 4.主句中的谓语由情态动词构成时,将情态动词如can/may/must/could等提到主句的主语前。 5.主句中时态为将来时,将will等提到主句中的主语前面。

until用法

一、until ,till和not untill的区别 till / until在表达方式和意义上的特殊性:until是till的强调形式,但是它们表达的意义是相同的,都表示"直到某时"。不过,当主句是否定句时,它引出的意思是"直到(某时)(某动作)才(发生)" ,这时候常会出现"not until …"的结构,如果将"not until …"的结构放在句首,那么主句要写成倒装句。例如: He didn't go to sleep until 12 last night . 他昨晚直到十二点钟才睡觉。 They didn't realize their fault till we pointed it out to them . 直到我们向他们指出了他们的错误,他们才意识到。 Not until we pointed out their fault to them did they realize it . 直到我们向他们指出了他们的错误,他们才意识到。 但是,当主句是肯定句时,它引出的意思是"直到(某时某动作停止了)" 。例如: The students made much noise till the teacher came into the classroom . 直到老师走进教室学生们才停止了大声喧哗。 The young couple were very happy until they used up all their money . 那对年青夫妇直到花光了所有的钱才沮丧起来。 另外,until 可以放在句首而till则不行。我们可以说:Until they used up all their money, the young couple were very happy .我们却不可以说:Till they used up all their money, the young couple were very happy . 二、肯定与否定 1.肯定形式表示的意思是"做某事直至某时",动词必须是延续性的。 2.否定形式表达的意思是"直至某时才做某事"。动词为延续性或非延续性都可 以。 3.正确使用这两个连词的关键之一就在于判断句中的动词该用肯定式还是否 定式。 肯定句: I slept until midnight. 我一直睡到半夜时醒了。 Wait till I call you. 等着我叫你。 (在肯定句中可用before代替 Let's get in the wheat before the sun sets.)否定句:She didn't arrive until 6 o'clock. 她直到6点才到。Don't get off the bus until it has stopped. 公共汽车停稳后再下车。 I didn't manage to do it until you had explained how. 直到你教我后,我才会做。

Java代码优化

1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问; 第二,控制实例的产生,以达到节约资源的目的; 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。 2. 尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存,如 Java代码 public class A{ static B b = new B(); } 此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。 3. 尽量避免过多过常的创建Java对象 尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。 4. 尽量使用final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如https://www.doczj.com/doc/3b15820181.html,ng.String.为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%.

5. 尽量使用局部变量 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。 6. 尽量处理好包装类型和基本类型两者的使用场所 虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。 在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。 7. 慎用synchronized,尽量减小synchronize的方法 都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以synchronize的方法尽量小,并且应尽量使用方法同步代替代码块同步。 8. 尽量使用StringBuilder和StringBuffer进行字符串连接 这个就不多讲了。 9. 尽量不要使用finalize方法 实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。 10. 尽量使用基本数据类型代替对象 String str = "hello"; 上面这种方式会创建一个"hello"字符串,而且JVM的字符缓存池还会缓存这个字符串; String str = new String("hello"); 此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

ehcache原理

转ehcache 基本原理 hjp222发表于2011-03-22 16:30 最后修改于2011-05-16 15:32 浏览(105) 评论(0)分类:ehcache 举报 ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache 提供了用内存,磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。同时ehcache作为开放源代码项目,采用限制比较宽松的Apache License V2.0作为授权方式,被广泛地用于Hibernate, Spring,Cocoon等其他开源系统。 Ehcache的类层次模型主要为三层,最上层的是CacheManager,他是操作Ehcache的入口。我们可以通过CacheManager.getInstance()获得一个单个的CacheManager,或者通过CacheManager的构造函数创建一个新的CacheManager。每个CacheManager都管理着多个Cache。而每个Cache都以一种类Hash的方式,关联着多个Elemenat。而Element则是我们用于存放要缓存内容的地方。 ehcache的刷新策略 ehcache的刷新策略是当缓存在放入的时候记录一个放入时间,它是用Lazy Evict的方式,在取的时候同设置的TTL比较 ehcache缓存的3种清空策略: 1 FIFO,先进先出 2 LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 3 LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。事件处理 可以为CacheManager添加事件监听,当对CacheManager增删Cache时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。 可以为Cache添加事件监听,当对Cache增删Element时,事件处理器将会得到通知。要配置事件处理,需要通过ehcache的配置文件来完成。 ehcache参数配置: maxInMemory - 设定内存中创建对象的最大值。 eternal - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。 timeToIdleSeconds - 设置某个元素消亡前的停顿时间。也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则设置该属性也无用)。 如果该值是0 就意味着元素可以停顿无穷长的时间。 timeToLiveSeconds - 为元素设置消亡前的生存时间。也就是一个元素从构建到消亡的最大时间间隔值。这只能在元素不是永久驻留时有效。 overflowToDisk - 设置当内存中缓存达到maxInMemory 限制时元素是否可写到磁盘上。

相关主题
文本预览
相关文档 最新文档