l Coherence下载地址:
http://www.oracle.com/technetwork/cn/middleware/coherence/downloads/index.html
l Coherence安装:
Coherence是纯Java的框架,不需要额外的安装。首先在Oracle网站上下载开发包,最新为3.4版,只有13M,可以说是很小很强大。 SDK解压即可,包含 bin, doc, example, lib 四个目录。Doc下包含了完整的user-guide,只是有点长,有350多页。
创建或切换到一个cache:Coherence集群是由Node构成的,每个Node既存储数据,又可以查询数据。 运行 bin/coherence.sh命令就能启动一个Node实例。 运行多次,就能启动多个实例,各Node能自动检测到网路内新启动的Node,并加入集群。 第一个节点启动信息大致为:
MasterMemberSet(
ThisMember=Member(Id=1, Timestamp=2014-09-01 00:25:33.724, Address=10.2.48.181:8088, MachineId=14517, Location=site:,process:2413, Role=CoherenceConsole)
OldestMember=Member(Id=1, Timestamp=2014-09-01 00:25:33.724, Address=10.2.48.181:8088, MachineId=14517, Location=site:,process:2413, Role=CoherenceConsole)
ActualMemberSet=MemberSet(Size=1
Member(Id=1, Timestamp=2014-09-01 00:25:33.724, Address=10.2.48.181:8088, MachineId=14517, Location=site:,process:2413, Role=CoherenceConsole)
)
MemberId|ServiceVersion|ServiceJoined|MemberState
1|3.7.1|2014-09-01 00:25:36.999|JOINED
RecycleMillis=1200000
RecycleSet=MemberSet(Size=0
)
)
最后会出现命令行提示符
通过Coherence控制台命令就可以执行Cache的基本操作。
l 创建一个基本的Cluster
1)使用一个文本编辑器,打开Coherence_home/bin/cache-server脚本
2)修改java_opts变量,包含tangosol.coherence.cluster和tangosol.coherence.clusterport系统属性如下:
set java_opts="-Xms%memory% -Xmx%memory% -Dtangosol.coherence.cluster=cluster_name -Dtangosol.coherence.clusterport=port" 替换cluster_name和端口号的值,对于cluster是唯一的。例如,使用你的名字来定义cluster的名和和你电话号码的最后四位作为端口 号
3)保存并关闭cache-server脚本
4)重复1到3的步骤来修改Coherence_Home/bin/coherence脚本
5)运行cache-server脚本。启动一个缓存服务器,输出信息提供了关于cluster成员的信息。
6)运行两个coherence脚本,每个实例启动后,输出信息提供了关于各自的集群成员的信息。每个实例返回了一个对于命令行工具的命令提示符。
l 创建缓存
在任意一个缓存工厂实例的命令提示符里,创建一个名为Cmcc的缓存。使用cache命令:
cache Cmcc
在命令提示符,使用put命令来存放一个简单的字符串进行的缓存,通过键入一个key/value值对(用空格分开):
put key1 hello
这个命令返回显示null。put命令总是返回了一个给定键的以前的值。null值被返回,因为这是这个键的第一个值。
切换到另一个缓存工厂实例,从命令提示符创建一个Cmcc缓存,使用cache命令:
cache Test
从命令提示符,检索缓存中的字符串,使用get命令,输入键名
get key1
这个命令返回显示hello。任何一个缓存功能进程能够添加和移除缓存条目,因为进程是同一个集群的一部分,并且Cmcc缓存是被所有集群成员所知道的。此外,既然缓存服务器存储了缓存数据的备份,每个缓存工厂进程都能够被关闭,缓存数据仍然存在。
Coherence默认的形式是用多播来寻找cluster。Coherence能够被配置为使用单播,如果网络中不允许使用多播。
l 默认的配置文件说明
tangosol-coherence.xml-这个文件提供了operational 和run-time设置,被用来创建和配置cluster,通讯和数据管理服务。这个文件代表性的被称为operational deployment descriptor.这个文件的架构是coherence-operational-config.xsd文件。
tangosol-coherence-override-dev.xml 当Coherence启动在开发模式时,这个文件覆盖了tangosol-coherence.xml文件的operational 设置。默认的,Coherence启动与developer 模式,这个文件中的设置会被使用。这个文件中的设置适合开发环境。这个覆盖文件的架构文件和operational deployment descriptor的架构文件是一样的。
tangosol-coherence-override-eval.xml 当Coherence启动与evaluation模式时候,这个文件覆盖了在tangosol-coherence.xml文件的operational 设置。这个文件中的设置适合evaluating Coherence.这个覆盖文件的架构文件和operational deployment descriptor的架构文件是一样的。
tangosol-coherence-override-prod.xml当Coherence启动与 evaluation模式时候,这个文件覆盖了在tangosol-coherence.xml文件的operational 设置。这个文件中的设置适合production Coherence.这个覆盖文件的架构文件和operational deployment descriptor的架构文件是一样的。
coherence-cache-config.xml 这个文件用来指定在cluster中使用的各种各样的缓存类型。这个文件被代表性的称为configuration deployment descriptor.这个文件的架构是coherence-cache-config.xsd文件。
coherence-pof-config.xml 当使用Portable Object Format(POF)来序列化对象时,这个文件用来指定自定义的数据类型。这个文件被代表性的称为POF configuration deployment descriptor.这个文件的架构是coherence-pof-config.xsd文件。
Management configuration files 一个用来配置coherence management reports的文件集合。这些文件在coherence.jar库的/reports目录里。文件包含了一组配置文件的报告(report-group.xml。默认的),参考了许多的报告定义文件。每个报告定义文件的结果是创建一个报告文件,该文件显示管理信息基于特定的一组度量。 这些文件的架构分别是coherence-report-config.xsd 和 coherence-report-group-config.xsd file.
l Coherence常用命令:
创建或切换到一个cache:Map (?): cache cmcc
Put一个数据:Map (ccc1): put key1 value1
Get一个数据: Map (ccc1): get key1
查看有哪些cache:Map (?): maps
查看一个cache下的所有key:Map (ccc1): list
你不必关心数据存在哪里,可以在Node1上 put一个数据,在Node2上get出来。 默认启动Node使用的是 Coherence.jar中的缓存配置文件 coherence-cache-config.xml ,使用的是DistributedCache 分区缓存
l Coherence在编程中使用API1-------基础:
使用Coherence进行数据管理的应用程序中的API调用非常简单,无论集群有多少个物理机器,多少个节点实例,客户端只逻辑上面对集群
NamedCache cache = CacheFactory.getCache( cacheName );
cache.put(key, value);
Object value = cache.get(key);
必须引入coherence.jar, tangosol.jar 等必要的类库文件
l Coherence在编程中使用API2--------查询:
添加索引可以是查询更有效:
// ValueExtractor : 提取内容
// Ordered 是否排序
// 排序比较器
cache.addIndex(ValueExtractor, Ordered, comparator)
内容提取器类型:
ReflectionExtractor 反射提取器
比如:new ReflectionExtractor("getAge")
KeyExtractor 关键字提取器
new KeyExtractor(new ReflectionExtractor("getName"))
ChainedExtractor 链接提取器
new ChainedExtractor("getAddress.getCity")
entrySet 查询集合:
entrySet(Filter)方法内部是一个过滤器类型
过滤器类型:
EqualsFilter 提取值等于参数字符串的对象
new EqualsFilter("getName", "JS")
NotEqualsFilter 与Equal过滤器相反
new EqualsFilter("getName", "JS")
AndFilter 链接两个过滤器
new AndFilter(
new EqualsFilter("getName", "JS1"),
new EqualsFilter("getName", "JS2"))
LikeFilter 和数据库的like 相似
new LikeFilter("getName","J%")
GreaterFilter 大于判断
new GreaterFilter("getAge", 20)
coherence 集合查询:
//得到大于20岁的个数
cache.aggregate(new GreaterFilter("getAge", 20), new Count())
//得到最小年龄
cache.aggregate(AlwaysFilter.INSTANCE,new LongMin("getAge"))
//得到最大年龄
cache.aggregate(AlwaysFilter.INSTANCE,new LongMax("getAge"))
//得到平均年龄
cache.aggregate(AlwaysFilter.INSTANCE,new DoubleAverage("getAge"))
l 1 复制缓存(ReplicatedCache)
数据在集群成员中进行全复制,每个节点都有一个完整的数据拷贝。这种集群下,read性能最高( cache.get(key) 操作),容错性好,但cache.put(key,value) 操作性能较低。如果Node很多,每次put操作都要在所有成员上执行一次
这是一种传统的集群技术,不是Coherence的亮点。
l 2 乐观缓存 (OptimisticCache)
它类似于复制缓存,但不提供并发控制(Concurrency Control)。这种集群数据吞吐量最高,各节点容易出现数据不一致的情况。
l 3 分区缓存(Distributed (Partitioned) Cache)
Coherence 的亮点。默认情况下,一份数据A只在两个节点上有拷贝,第二份作为备份数据(Backup),用于容错。
从整体上看,假设应用需要的Cache总内存为 M,该模式将数据分散到N个节点上,每个JVM只占用 M/N 的内存消耗,与复制缓存每节点消耗 M量的内存形成对比,它可以极大节省内存资源。
l 4 Near缓存 (NearCache)
分区缓存的改进版。分区缓存将数据全部存到Cache Node上,而Near缓存将缓存数据中使用频率最高的数据(热点数据Hotspot)放到应用的本地缓存(Local Cache)区域。由于本地内存访问的高效性,它可以有效提升分区缓存的read性能
l 5 四种缓存类型的基本特点对比
几个重要因素:
JVM数量(N): 即启动的Node数量,每个节点为一个JVM进程;
数据大小(M):要缓存的数据总量的占用空间大小,如10M,120M等;
冗余度(R) :缓存的secondary备份个数。分区缓存默认为1,可以配置2,3,…
本地缓存大小(L):(仅对Near缓存而言)应用所在的本地缓存的空间大小字节数。
几种类型的对比:
l Coherence4种数据管理模式:
Read-Through,
Write-Through,
Refresh-Ahead
Write-Behind
数据管理模式体现在CacheStore 接口的功能上。
CacheStore负责直接和数据源交互,进行增删改查操作;并也负责和Coherence Cache交互,向其中写数据(put),读数据(get)和删除数据(remove)。CacheStore相当于 数据源和Cache间的桥梁。
对于不同的应用,由于数据源不同,如:DB,WebService ,FileSystem等, CacheStore有不同的实现。它一般作为应用的一部分。Coherence也为 Hibernate,Toplink等实现了一个CacheStore。
l 1 Read-Through:
Read-Through 的基本特点是同步读取。步骤为:
1)应用调用 CacheStore 查询数据X;
2)CacheStore 去Cache中查询,未发现数据时,向数据库执行查询操作,并将查询结果放到 Cache中, 并将结果返回给应用;
3)如果发现Cache中有数据,则直接从Cache读取,并返回给应用。
其特点体现在第二步,CacheStore调用 cache.get(X) 到 CacheStore 给应用返回数据,是同步操作。 也就是要在一个同步过程中先等待数据查询,Cache被填充,才能获得数据。 这种模式的性能比较低,不及 Refresh-Ahead。
l 2 Write-Through:
Write-Through 对应于数据修改操作,如 update,也具有同步的特点。
1)应用调用 CacheStore update数据X;
2)CacheStore 先update Cache中的数据,然后再向数据库执行update操作;
这种模式在一个同步过程中,先改Cache,再改数据库。因此性能也不是最理想的。
l 3 Refresh-Ahead:
与Read-Through相对,它是异步的。 Coherence在Cache数据过期前,有CacheStore自动重新从数据库加载数据。而前台应用在查询数据时,CacheStore 仅调用Cache.get(X)。因此这种模式的效率明显高于read-through。 自动重载数据的时间可以设定。
l 4 Write-behind:
与write-through相对,它是异步的。
应用调用CacheStore进行update时,CacheStore不去操作数据库,直接返回结果。而Coherence集群自动对操作进行排队(queue),在间隔一段时间后(interval), CacheStore在执行队列中的 update 操作。 这样,减少的同步操作数据库的时间被节省,修改类功能的性能就能得到大幅提高。这也是Coherence的一大特色。
l 序列化选项:
因为序列化通常是集群数据管理中消费最大的,Coherence提供了下面的选项来序列化和反序列化数据:
1. com.tangosol.io.pof.PofSerializer-Portal Object Format (也可以引用POF)是一种和语言无关的二进制格式。POF的设计是用来在控件和时间上提高效率,在Coherence中是最常用的序列化选项。
2. java.io.Serializable 最简单的,但是最慢的选项。
3. java.io.Externalizable-这要求开发人员手动实现序列化,但是能够提供重大的性能提升。与java.io.Serizlizable比较,这个能够用两种或者两种以上的因素截取序列化数据(在分布式缓存中特别有用,因为他们通常以序列化形式缓存数据)。最重要的,CPU使用率显著的降低。
4. com.tangosol.io.ExternalizableLite-这和java.io.Externalizable十分相似,但是提供了更好的性能和更低的内存利用率,通过使用了一个更加高效的IO stream的实现。
5. com.tangosol.run.xml.XmlBean-ExternalizableLite的默认实现
l Invocation服务
Coherence调用服务能够部署运算代理到各个cluster的节点。这些代理既可以是excute-style(部署和异步监听)有可以是query-style(部署和同步监听)。 调用服务能够通过com.tangosol.net.InvocationService接口来访问,包含以下两个方法:
public void execute(Invocable task, Set setMembers, InvocationObserver observer); public Map query(Invocable task, Set setMembers); 服务的实例可以从com.tangosol.net.CacheFactory 类来检索。 Coherence为以人物为中心的处理实现WorkManager API。