Infinispan网格缓存框架.docx
- 文档编号:4118146
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:32
- 大小:77.37KB
Infinispan网格缓存框架.docx
《Infinispan网格缓存框架.docx》由会员分享,可在线阅读,更多相关《Infinispan网格缓存框架.docx(32页珍藏版)》请在冰豆网上搜索。
Infinispan网格缓存框架
WhatisInfinispan_CN(什么是Infinispan)
版本1
创建于:
2010-10-25上午5:
58作者jombowang-最后修改:
2010-10-28上午4:
52作者jombowang
Infinispan是一个开源的数据网格平台.它对外发布了一个兼容JSR-107的Cache接口(该接口继承了java.util.Map),你可以通过该接口来存储对象。
Infinispan可以以本地模式运行,然而它的真正价值在于分布式模式,通过分布式模式可以将缓存集聚起来形成一个巨大的堆内存。
分布式模式相对于简单复制要强大的多,因为每个数据项分布在固定数目的节点上,因此使得服务器可以进行错误恢复,又由于存储一个数据项的工作量相对于集群的大小是恒定的,这使得服务器具备了可扩展性。
那么,为什么要选择Infinispan·?
Infinispan具有以下特性:
∙大容量堆内存和高可用性–假设你有100个刀片服务器,并且每个节点有2GB的空间用于复制缓存,最终你获得的总数据量的大小为2GB.每台服务器仅仅是一个拷贝。
相反,借助于分布式网格-假设你的每份数据只有一份拷贝-你将获得100GB的的备份虚拟堆内存,并且在网格中的任何位置都能访问。
如果某台服务器崩溃了,网格只需要简单地创建一份丢失数据的新副本,并将它们放到另一台服务器上。
应用也无需再借助于一个巨大的独立数据库来获取数据以追求最大性能的-这是80%以上的企业应用中的瓶颈所在!
∙扩展性–由于数据是均匀分布的,所以除了考虑到网络上的组通讯,根本就没有必要来限制网格的大小-网络上的组通讯只要能够发现一个新的节点即可.所有的数据获取方式都是通过点对点通信,即节点之间直接进行通信,非常容易控制。
Infinispan的增加或者减少不需要关闭整个服务。
简单的添加删除集群中的机器不会引发任何服务中断。
∙数据分布–Infinispan使用一致性哈希算法来决定集群中键值的存储位置。
一致性哈希算法成本低,速度快并且最重要的是不需要额外的元数据或者网络通信就能确定键值的位置。
数据分布的目的是为了在集群环境下保持足够的状态副本以使其具备可持续性和容错性,但是又不会有过多的副本而阻碍Infinispan的可扩展性。
∙持久化–Infinispan暴露了一个CacheStore接口和几个高性能的实现-包括JDBCCacheStores,基于文件系统的CacheStores以及AmazonS3CacheStores等等.CacheStores可以用于“热启动”,或者用于确保重启整个表格时数据不丢失,或者设置成当耗尽内存时能够将数据写到硬盘。
∙语言绑定–(PHP,Python,Ruby,C,等等.)-Infinispan计划实现一个语言独立的服务器模块。
它既将会支持流行的的memcached协议(几乎是任何主流语言实现的)也会支持名称为HotRod的Infinispan特定协议.这就意味着Infinispan不仅仅适用于Java。
任何想要使用快速数据网格的主流站点或者应用都将可能选择Infinispan。
∙管理–当你考虑在数百个服务器上运行这个表格时,管理就不再是额外的,它变成了一种必须。
管理多个分布在不同服务器上的Infinispan实例的首选方式是使用JOPR,JOPR是JBoss'企业级管理解决方案。
由于JOPR'的代理和自动发现特性,监控CacheManager和Cache实例就变得非常简单。
∙支持表格计算–路线图中还包括支持网格中运行可运行程序的能力。
你将能够将复杂处理放到服务器,数据却是本地数据,然后获取数据。
map/reduce模式在需要计算大量数据来获取少量结果的应用中是十分常见的
EvictionExamples_CN(Eviction示例)
版本2
创建于:
2011-1-11上午11:
13作者jombowang-最后修改:
2011-1-11下午12:
57作者jombowang
下面是关于Eviction和Expiration的注意点:
1Expiration是一个顶层结构,可以通过配置或者cacheAPI定义。
之后我们会有更多的阐述。
2Eviction针对的是本地缓存实例,Expiration针对的则是整个集群范围内的节点。
Expiration的lifespan和maxIdle的值会在缓存每个数据项间进行复制。
3Expiration的lifespan和maxIdle的值会持久化到CacheStores,所以这些信息也能够被eviction或者passivation使用。
4Infinispan包含了三种eviction策略,EvictionStrategy.NONE,EvictionStrategy.LRU和EvictionStrategy.FIFO,并且这些都是最有用的。
如果需要,将来还会增加更多的策略。
4从Infinispan4.1版本开始,EvictionStrategy.UNORDERED将会可用。
5从架构上讲,这些是完全新的实现。
配置
Eviction可以通过Configurationbean或者XML文件的方式进行配置。
Eviction配置是基于单个缓存的。
关于Eviction的有用配置元素包括:
通过编程方式,可以达到同样的效果:
configuration.setEvictionStrategy(EvictionStrategies.FIFO);
configuration.setEvictionWakeupInterval(1000);
configuration.setEvictionMaxEntries(2000);
configuration.setExpirationLifespan(1000);
configuration.setExpirationMaxIdle(500);
默认值
默认情况下,Eviction是没有启用的。
如果启用了Eviction(通过一个空白的
∙strategy:
如果没有指定策略,将会默认使用EvictionStrategy.NONE。
∙wakeupInterval:
如果没有指定,默认值是5000。
o如果你想要禁用eviction线程,可以设置wakeupInterval值为-1。
∙maxEntries:
如果没有指定,默认值是-1,意味着包含无限个数据项。
o0意味着没有数据项,eviction将会一直使缓存为空。
Eviction的lifespan和maxIdle值默认为-1。
Expiration的使用
你可以为缓存中的任意键值对设置一个Expiration的lifespan和maxIdle的值。
它即可以像上面所说的那样通过配置设置成集群范围的,也可以使用Cache接口来定义键值对。
任何键值对定义的值都能够覆写该数据项在集群范围内的默认值。
例如使用下面的配置:
//thisentrywillexpirein1000millis
cache.put("pinotnoir",pinotNoirPrice);
//thisentrywillexpirein2000millis
cache.put("chardonnay",chardonnayPrice,2,TimeUnit.SECONDS);
//thisentrywillexpire1000millisafteritislastaccessed
cache.put("pinotgrigio",pinotGrigioPrice,-1,
TimeUnit.SECONDS,1,TimeUnit.SECONDS);
//thisentrywillexpire1000millisafteritislastaccessed,or
//in5000millis,whichevertriggersfirst
cache.put("riesling",rieslingPrice,5,
TimeUnit.SECONDS,1,TimeUnit.SECONDS);
Eviction设计
Eviction的核心是一个EvictionManager实例。
如果配置了Eviction或者Expiration,则这个实例是可用的。
EvictionManager的作用就是eviction线程whichperiodicallypurgesitemsfromtheDataContainer.如果禁用了eviction线程(wakeupInterval设置为-1),eviction可以通过调用EvictionManager.processEviction()来手动启动,例如通过周期性的运行应用中的另一条维护线程。
evictionmanager是按照下面的方式来处理evictions的:
6触发DataContainer清除过期的数据项
7触发CacheStores(如果存在的话)清除过期数据项
8调整DataContainer的大小为指定值,该值的大小有maxElements属性决定
DataContainer
DataContainer是缓存和Eviction的核心。
因此,使用哪种DataContainer接口的实现决定于是否启用了eviction和使用了哪种eviction策略。
DataContainer提供了类似purgeExpired()和iterator()的方法,这些方法会在上述步骤1和步骤3由EvictionManager调用。
如果缓存不启用Eviction,那么效率最高的datacontainer实现就是SimpleDataContainer。
FIFOSimpleDataContainer和LRUSimpleDataContainer实现会在排序上消耗一定的性能。
关于算法的细节可以参照实现的Javadocs。
ListenersandNotifications_CN(Listeners和Notifications)
版本1
创建于:
2011-1-9上午6:
31作者jombowang-最后修改:
2011-1-9上午7:
04作者jombowang
Infinispan提供了一个listenerAPI,通过该API客户端能够进行注册并且当事件发生时能后获取通知。
这个注释驱动的API可以应用到两个不同的级别:
cache事件级别和cachemanager事件级别。
事件触发一个通知,这个通知将会被分发到对应listeners。
Listeners是简单的POJOs,标记有@Listener注释并且通过Listenable接口中提供的方法进行注册。
Cache和CacheManager都实现了Listenable接口,也就意味着你能够讲listeners注册到cache或者cachemanager上,以便能够获取cache级别或者cachemanager级别的通知。
例如,下面的类定义了一个listener,每次数据项被添加到缓存时都会输出信息:
@Listener
publicclassPrintWhenAdded{
@CacheEntryCreated
publicvoidprint(CacheEntryCreatedEventevent){
System.out.println("Newentry"+event.getKey()+"createdinthecache");
}
}
更多全面的例子请参照Javadocsfor@Listener.
Cache级别的notifications
Cache级别事件是基于单个缓存发生的,并且是全局和集群范围的。
cache级别事件的例子包括添加、移除和修改数据项等等。
这些时间会触发通知被发送到注册到特定缓存的listeners。
关于cache级别的notifications及其方法级注释的更详尽列表请参照org.infinispan.notifications.cachelistener.annotation包的Javadocs。
Cachemanager级别notifications
Cachemanager级别的时间是基于cachemanager发生的。
它们也是全局和集群范围的,但是相关的时间会影响此cachemanager创建的所有缓存实例。
缓存中加入或者移除节点或者缓存的启动和停止都是cachemanager级别事件的例子。
关于cachemanager级别的notifications及其方法级注释的更详尽列表请参照org.infinispan.notifications.cachemanagerlistener.annotation包中的JavaDoc。
同步
默认情况下,所有的notifications都是由产生事件的线程分发的。
这也就意味着自定义的listener不能够阻塞或者消耗过长的时间,因为它将会阻止处理线程。
另一种方案是,你可以声明这些listeners为异步执行,这样将会产生一个单独的线程池来用户分发notification而不会阻塞原有的进程。
你可以通过下面的注释来完成:
@Listener(sync=false)
publicclassMyAsyncListener{....}
异步线程池
为了将线程池改变成异步的分发通知,可以在配置文件中使用
UsingtheCacheAPI_CN(CacheAPI的使用)
版本1
创建于:
2010-10-28上午10:
35作者jombowang-最后修改:
2011-1-9上午6:
26作者jombowang
o某些Map方法的限制
o临时和永久数据
o临时数据和过期范例
oAdvancedCache接口
oFlags
o自定义拦截器
Cache接口
Infinispan对外发布了一个兼容JSR-107的Cache接口。
Cache接口对外提供了添加、获取和删除数据项的简单方法,包括JDK'sConcurrentMap接口提供的原子机制。
根据所使用的缓存模式,调用这些方法将会导致大量现象产生,有可能会将一个数据项复制到远程节点或者从一个远程节点获取某个数据项,也有可能是快速存储。
注意:
对于简单的使用来说,使用CacheAPI和使用JDKMapAPI没有什么区别,因此从基于Map的简单内存缓存迁移到基于Infinispan的缓存是十分容易的。
某些Map方法的限制
当使用Infinispan时,Map提供的一些方法有一定的限制,例如size(),values(),keySet()和entrySet()。
特别之处在于,这些方法是不可靠的并且只能。
不论是本地还是全局模式,这些方法都不会要求锁,并且也不会考虑到并发修改,添加和删除。
更进一步来说,他们的操作只是针对本地数据容器,不会为你提供一个全局的状态视图。
如果尝试在全局环境下使用这些操作时,将会对性能产生巨大的影响并最终成为一个扩展性瓶颈。
因此,这些方法只能出于调试或者输出信息的目的使用。
临时和永久数据
为了更加简单的存储数据,Infinispan的cacheAPI允许你对数据项附带生命期的信息。
例如,简单调用put(key,value)方法将会创建一个永久的数据项,也就是说,一个数据项将会永远存储在缓存中直到它被移除(或者为了防止内存溢出而使其在内存中失效)。
然而,如果你调用put(key,value,lifespan,timeunit)来向内存中存储一个数据,将会创建一个临时的数据项,也就是说这个数据项会有一个固定的有效期,并且会在超过有效期后自动过期。
除了有效期(lifespan),Infinispan还支持其他的一个决定过期的语义项,maxIdle。
多个lifespan和maxIdle能够搭配使用。
临时数据和过期范例
通过Infinispan使用临时数据的例子请参照此页面页面。
AdvancedCache接口
除了简单的Cache接口,Infinispan还提供了一个AdvancedCache接口。
通过AdvancedCache能够注入自定义拦截器,访问内部组件以及应用flags来改变某些cache方法的默认行为.。
下面的代码描述了如何获取一个AdvancedCache:
AdvancedCacheadvancedCache=cache.getAdvancedCache();
Flags
Flags应用于常规的缓存方法来改变某些方法的默认行为。
对于flags的列表和他们的影响可以参照Flag说明。
Flags通过调用AdvancedCache.withFlags()发挥作用。
通过下面的方法可以应用到个flags到一次缓存调用,例如:
advancedCache.withFlags(Flag.CACHE_MODE_LOCAL,Flag.SKIP_LOCKING)
.withFlags(Flag.FORCE_SYNCHRONOUS)
.put("hello","world");
自定义拦截器
AdvancedCache接口为高级开发者提供了一种机制,通过这种机制使得开发者能够绑定自定义的拦截器。
自定义拦截器使开发者能够改变cacheAPI方法的行为,并且AdvancedCache接口使得开发者能够在运行时通过编程的方法来绑定这些拦截器。
更多细节请参考AdvancedCacheJavadocs。
UsingtheCacheAPI_CN(CacheAPI的使用)
版本1
创建于:
2010-10-28上午10:
35作者jombowang-最后修改:
2011-1-9上午6:
26作者jombowang
o某些Map方法的限制
o临时和永久数据
o临时数据和过期范例
oAdvancedCache接口
oFlags
o自定义拦截器
Cache接口
Infinispan对外发布了一个兼容JSR-107的Cache接口。
Cache接口对外提供了添加、获取和删除数据项的简单方法,包括JDK'sConcurrentMap接口提供的原子机制。
根据所使用的缓存模式,调用这些方法将会导致大量现象产生,有可能会将一个数据项复制到远程节点或者从一个远程节点获取某个数据项,也有可能是快速存储。
注意:
对于简单的使用来说,使用CacheAPI和使用JDKMapAPI没有什么区别,因此从基于Map的简单内存缓存迁移到基于Infinispan的缓存是十分容易的。
某些Map方法的限制
当使用Infinispan时,Map提供的一些方法有一定的限制,例如size(),values(),keySet()和entrySet()。
特别之处在于,这些方法是不可靠的并且只能。
不论是本地还是全局模式,这些方法都不会要求锁,并且也不会考虑到并发修改,添加和删除。
更进一步来说,他们的操作只是针对本地数据容器,不会为你提供一个全局的状态视图。
如果尝试在全局环境下使用这些操作时,将会对性能产生巨大的影响并最终成为一个扩展性瓶颈。
因此,这些方法只能出于调试或者输出信息的目的使用。
临时和永久数据
为了更加简单的存储数据,Infinispan的cacheAPI允许你对数据项附带生命期的信息。
例如,简单调用put(key,value)方法将会创建一个永久的数据项,也就是说,一个数据项将会永远存储在缓存中直到它被移除(或者为了防止内存溢出而使其在内存中失效)。
然而,如果你调用put(key,value,lifespan,timeunit)来向内存中存储一个数据,将会创建一个临时的数据项,也就是说这个数据项会有一个固定的有效期,并且会在超过有效期后自动过期。
除了有效期(lifespan),Infinispan还支持其他的一个决定过期的语义项,maxIdle。
多个lifespan和maxIdle能够搭配使用。
临时数据和过期范例
通过Infinispan使用临时数据的例子请参照此页面页面。
AdvancedCache接口
除了简单的Cache接口,Infinispan还提供了一个AdvancedCache接口。
通过AdvancedCache能够注入自定义拦截器,访问内部组件以及应用flags来改变某些cache方法的默认行为.。
下面的代码描述了如何获取一个AdvancedCache:
AdvancedCacheadvancedCache=cache.getAdvancedCache();
Flags
Flags应用于常规的缓存方法来改变某些方法的默认行为。
对于flags的列表和他们的影响可以参照Flag说明。
Flags通过调用AdvancedCache.withFlags()发挥作用。
通过下面的方法可以应用到个flags到一次缓存调用,例如:
advancedCache.withFlags(Flag.CACHE_MODE_LOCAL,Flag.SKIP_LOCKING)
.withFlags(Flag.FORCE_SYNCHRONOUS)
.put("hello","world");
自定义拦截器
AdvancedCache接口为高级开发者提供了一种机制,通过这种机制使得开发者能够绑定自定义的拦截器。
自定义拦截器使开发者能够改变cacheAPI方法的行为,并且AdvancedCache接口使得开发者能够在运行时通过编程的方法来绑定这些拦截器。
更多细节请参考AdvancedCacheJavadocs。
ClusteredConfigurationQuickStart_CN(集群式配置快速入门)
版本2
创建于:
2011-1-9上午1:
57作者jombowang-最后修改:
2011-1-9上午3:
09作者jombowang
从4.2.0.CR4版本开始,Infinispan自带了一个预定义的JGroups栈,可以使你更加容易的进行集群配置。
∙使用外部的JGroups文件
∙使用预定义的JGroups文件
o调整JGroups设置
▪jg
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Infinispan 网格 缓存 框架
![提示](https://static.bdocx.com/images/bang_tan.gif)