分布式Cache ecache

来源:互联网 发布:大学女生室友礼物知乎 编辑:程序博客网 时间:2024/06/11 18:48

文档编号:PT-TR-CACHE

 

 

 

Prient ecache使用文档

Prient ecache Architect Document

   

V3.0

 

 

 

 

 

 

 

初始版发行时间:2004/05/24

当前版发行时间:2004/06/01

 

 

 

 

 

 

 

 

 

蓬天信息系统(北京)有限公司

技术研发部


目录

基本信息... 3

功能特点... 4

技术背景... 4

接口范围... 4

API说明... 4

注意事项... 5

开发和测试实例... 5

本地方式测试... 5

分布式方式测试... 5

Notification的扩展实现... 9

 


 

基本信息

文档描述信息:

文件名:

Prient ecache使用文档

最新版本:

V3.0

文档创建者:

蓬天公司技术研发部

文档维护者:

组织:蓬天公司技术研发部

成员:原力、陈永辉,任民

文档评审者:

蓬天公司技术研发部、南京地税项目组、西安地税项目组

定稿日期:

2004-06-01

文档目标:

此文档从理论根据,概念,特征,实例的角度描述了Prient ecache的技术细节以及开发时的接口和使用

 

文档修改摘要:

版本

日期

修改描述

作者

V3.0

2004-06-01

Prient ecache使用文档

原力

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Prient ecache具备了高速检索和分布式,同时它是一个ThreadSafe线程安全的Cache产品。

 

功能特点

1、 支持本地方式存取

2、 支持分布式同步机制

3、 Cache独立管理

4、 可以进行外部配置

5、 符合线程安全规范,无内存泄漏问题,支持阶段式Cache和永久Cache

6、 易于扩展

7、 文档齐备

技术背景

ecache使用了以下技术来完善Cache机制

1、 使用LRUMap作为Cache的元素存放方式,使用LRU算法

2、 使用concurrent的高效LinkedHashMap来存放Cache元素的索引列

3、 使用DiskStore扩展保证在内存缓存技术,保证Cache数据完整

4、 使用Jgroup技术进行Cluster间的Cache同步

5、 定义Notification接口用于扩展业务层对Cache的个性需求

6、 提供Local方式的CacheManager用于直接访问本地Cache

7、 提供Multi方式的MultiCacheManagerLocal Cache进行封装,产生用于分布式处理的MultiCache

8、 提供ObjectCache接口,用于开发者开发Cache来封装local cache

 

接口范围

Core programs

Cache.Java 本地Cache的实现,其提供了本地Cache访问的接口,有本地CacheManager管理

CacheEntity.java Cache中存放需要Cache对象的元素封装,CacheEntity提供了判断元素的生命周期,版本,访问率等监视元素的属性

Interface

1、 ObjectCache.java提供对local Cache的自定义封装接口

2、 Notification.java提供对分布式Cache在同步时的应用接口

Factory

CacheManager.java 本地Cache的管理器,管理本地Cache,可被再次封装,封装方法见MutiCacheManager.java

MultiCacheManager.java 封装了CacheManager,并提供分布式访问

Extensibility

MutiCache.java扩展了本地Cache,提供分布式访问

 

API说明

详细内容可参阅ecache.chm(JavaDoc为中文)

 

注意事项

1Cache中的元素中存放的业务对象,为了保证线程安全,必须使用可Serializable的对象,在我们常用的CollectionArrayList,和HashMap都不属于此列

对于这些Collection

List,可以使用Vector代替,也可以使用com.ptf.util.concurrent.CopyOnWriteArrayList代替

HashMap, 可以使用Hashtable代替,也可以使用com.ptf.util.concurrent.LinkedHashMap或者com.ptf.util.concurrent.ConcurrentHashMap代替

 

相关的一些非SerializabelCollection可以在com.ptf.util.concurrent.中找到替代的实现

 

2、 如果是在一个JVM中应用Cache,可以直接使用CacheManagerCache

 

3、 如果在多个JVM或分布式环境中使用Cache,可以使用MultiCacheManagerMultiCache

 

4、 广播发送方无法收到自己发送的广播,需要发送方自己手动执行notificationexecute()方法

 

5、广播方式已经定义并测试,请不要随意修改广播方式

 

开发和测试实例

package com.ptf.ectest;中提供了各种应用的测试

包含

本地方式测试

com.ptf.ectest.CacheMgrTest为本地cache的使用测试

com.ptf.ectest.CacheTestJunitCache测试

分布式方式测试

com.ptf.ectest.MultiCacheMgrConsoleTest

com.ptf.ectest.MultiCacheMgrRecivedTest

com.ptf.ectest.MultiCacheMgrRemoveTest

这三个程序中ConsoleRecived两个进程测试接受广播情况

Remove负责发送Remove动作的广播

 

代码示例

1、对Cache进行基本操作

              try

              {

                     //getMultiManager( null, null );中的两个参数如果不需要使用其它配置,可以置为空

                     //第一个参数表示使用Cache的配置文件,如ecache.xml(不推荐使用)

                     //第二个参数表示使用额外的广播协议,如jgroup.xml(不推荐使用)

                     MultiCacheManager manager = MultiCacheManager.getMultiManager( null, null );

                     //Cache组中获得指定的Cache

                     MultiCache cache = manager.getMultiCache( "sampleCache1" );

 

                     System.out.println( manager.getMultiCacheNames().length + "" );

                     for ( int i = 0; i < 500000; i++ )

                     {

                            //Cache进行添加元素操作,但不进行通知

                            //cache.multiStore(nitofication);为广播方式的添加元素

                            cache.addCacheEntity( new CacheEntity( "key[" + i + "]", "value1[" + i + "]" ) );

                     }

                     long st = System.currentTimeMillis();

                     for ( int i = 100; i < 200; i++ )

                     {

                            //Cache进行选取元素操作,不进行通知

                            CacheEntity entity = cache.getCacheEntity( "key[" + i + "]" );

                            System.out.println( entity );

                     }

 

                     long et = System.currentTimeMillis();

                     long ft = et - st;

                     System.out.println( ft );

                     System.out.println( cache.getSize() );

              }

              catch ( CacheException ex )

              {

                     ex.printStackTrace();

              }

              catch ( IllegalArgumentException ex )

              {

                     ex.printStackTrace();

              }

 

2、 cache进行remove的操作并通知到分布式cache

              try

              {

                     //getMultiManager( null, null );中的两个参数如果不需要使用其它配置,可以置为空

                     //第一个参数表示使用Cache的配置文件,如ecache.xml(不推荐使用)

                     //第二个参数表示使用额外的广播协议,如jgroup.xml(不推荐使用)

                     MultiCacheManager manager = MultiCacheManager.getMultiManager( null, null );

                     //Cache组中获得指定的Cache

                     //Cache的分布式操作,必须对同一指定的Cache操作,其它Cache不受影响

                     MultiCache cache = manager.getMultiCache( "sampleCache1" );

 

                     System.out.println( manager.getMultiCacheNames().length + "" );

                     for ( int i = 0; i < 500000; i++ )

                     {

                            //Cache进行添加元素操作,但不进行通知

                            //cache.multiStore(nitofication);为广播方式的添加元素

                            cache.addCacheEntity( new CacheEntity( "key[" + i + "]", "value1[" + i + "]" ) );

                     }

                     long st = System.currentTimeMillis();

                     for ( int i = 100; i < 200; i++ )

                     {

                            //Cache进行选取元素操作,不进行通知

                            CacheEntity entity = cache.getCacheEntity( "key[" + i + "]" );

                            System.out.println( entity );

                     }

                     //使用Notification的清空Cache通知实现清空分布式Cache

                     ClearAllNotification n = new ClearAllNotification("sampleCache1");

 

                     //广播自己无法收到,需要自己执行notificationexecute()方法

                     n.execute(cache);

 

                     //调用MultiCacheManager接口进行通知的发送

                     //其它JVM或服务器的Cache将顺次接受通知并执行和本操作一致的操作

                     manager.send(n);

 

                     long et = System.currentTimeMillis();

                     long ft = et - st;

                     System.out.println( ft );

                     System.out.println( cache.getSize() );

              }

              catch ( CacheException ex )

              {

                     ex.printStackTrace();

              }

              catch ( IllegalArgumentException ex )

              {

                     ex.printStackTrace();

              }

 

3、 本地cache的访问

 

try

              {

                     //使用单子创建Cache的初始化环境

                     CacheManager manager = CacheManager.create();

                     //获得已经创建的Cache

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

 

                     System.out.println( manager.getCacheNames().length + "" );

                     for ( int i = 0; i < 500000; i++ )

                     {

                            //Cache中添加元素

                            cache.addCacheEntity( new CacheEntity( "key[" + i + "]", "value1[" + i + "]" ) );

                     }

                     long st = System.currentTimeMillis();

                     for ( int i = 100000; i < 200000; i++ )

                     {

                            //获得Cache中已有的元素

                            cache.getCacheEntity( "key[" + i + "]" );

                     }

 

                     long et = System.currentTimeMillis();

                     long ft = et - st;

                     System.out.println( ft );

                     System.out.println( cache.getSize() );

              }

              catch ( CacheException ex )

              {

                     ex.printStackTrace();

              }

 

 

4、 动态的创建一个Cache

              try

              {

                     //使用单子创建Cache的初始化环境

                     CacheManager manager = CacheManager.create();

                     //动态的创建Cache并注册到CacheManager

                     //参数1Cache名称

                     //参数2Cache的最大元素数

                     //参数3:是否在最大数占用时,缓存新增的到磁盘缓存

                     //参数4:本Cache是否为永久Cache

                     //参数5:元素活动时间

                     //参数6:元素空闲时间

      

                     Cache cache = new Cache("testCache", 10000, true, false, 5, 2);

                     manager.addCache(cache);

 

                     System.out.println( manager.getCacheNames().length + "" );

                     for ( int i = 0; i < 500000; i++ )

                     {

                            //Cache中添加元素

                            cache.addCacheEntity( new CacheEntity( "key[" + i + "]", "value1[" + i + "]" ) );

                     }

                     long st = System.currentTimeMillis();

                     for ( int i = 100000; i < 200000; i++ )

                     {

                            //获得Cache中已有的元素

                            cache.getCacheEntity( "key[" + i + "]" );

                     }

 

                     long et = System.currentTimeMillis();

                     long ft = et - st;

                     System.out.println( ft );

                     System.out.println( cache.getSize() );

              }

              catch ( CacheException ex )

              {

                     ex.printStackTrace();

              }

 

 

Notification的扩展实现

       public String getCacheName();  //获得具体cache

 

       public String getCommand();   //获得通知类型

 

       public Serializable getKey(); //获得Entity Key

 

       public void setCacheName( String cachename );  //设置具体cache

 

       public void setKey( Serializable key ); //设置Entity key

 

       abstract void execute( ObjectCache cache ); //执行器接口

 

       public String toString(); //toString 接口

 

1、 在本接口中,主要实现的execute()方法,这个方法是分布式Cache在获得通知后,进行执行本地Cache操作的入口

2、 其它参数均为为execute()准备参数

3、 notification接口实现时,开发者可自定义属性来满足execute()方法需要

4、 command属性是标识本notification的名称,此标识应该唯一

                                               


以下为一个notification的示例

package com.ptf.ecache.cluster;

import java.io.*;

import com.ptf.ecache.*;

 

/**

 * 在分布式的cache容器管理器之间进行通讯以进行Reload所有Cache元素操作执行的通知实现

 * 本通知实现为在指定Cache进行一次全部EntityReload操作

 * @author com.prient.techresearch

 * @author 原力

 * @since 20040518

 * @version 1.1

 */

public class ReloadNotification

       implements Notification

{

       //-------------------------------------------------------------------------

       // 属性项

       //-------------------------------------------------------------------------

       /**

        * 具体的Cache name

        */

       private String cacheName;

 

       /**

        * 本通知的命令名称

        */

 

       private final static String command = "(reloadAll)";

 

       /**

        * 具体的Entity Key,本实例中未使用到

        */

       private Serializable key;

 

       /**

        * 设置Cache

        * @param cahcName String

        */

       public void setCacheName( String cahcName )

       {

              this.cacheName = cahcName;

       }

 

 

       /**

        * 获得Cache

        * @return String 名字

        */

       public String getCacheName()

       {

              return cacheName;

       }

 

       /**

        * 设置Entity key

        * @param key Serializable

        */

       public void setKey( Serializable key )

       {

              this.key = key;

       }

 

       /**

        * 获得key

        * @return Serializable

        */

       public Serializable getKey()

       {

              return key;

       }

 

       /**

        * 获得本通知的命令名称

        * @return the final value of static.

        */

       public String getCommand()

       {

              return command;

       }

 

       //-------------------------------------------------------------------------

       // 构造方法项

       //-------------------------------------------------------------------------

 

       /**

        * 默认的构造器,需要CacheName进行本通知的构造

        * @param cacheName String Cache

        */

       public ReloadNotification( String cahcName )

       {

              this.cacheName = cacheName;

       }

 

       /**

        * 命令执行器实现

        * 本执行器对本地Cache进行reload操作

        * 其分为两部分,1:清空指定的cache2:根据业务进行Cache的载入

        * @param cache ObjectCache Cache接口

        */

       public void execute( ObjectCache cache )

       {

              try

              {

                     cache.doClearAll();

                     //cache.doLoad() 本方法和业务相关,此处不进行实现

              }

              catch ( IOException ex )

              {

                     ex.printStackTrace();

              }

              catch ( IllegalStateException ex )

              {

                     ex.printStackTrace();

              }

       }

 

       /**

        * toString实现

        * @return String

        */

       public String toString()

       {

              StringBuffer buffer = new StringBuffer();

              buffer.append( command + cacheName );

              return buffer.toString();

       }

}

 

原创粉丝点击