分布式Cache ecache

原创 2004年09月01日 11:10:00

文档编号: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();

       }

}

 

利用ecache实现自定义缓存框架

ecache是一个基于纯Java进程的缓存框架,被用于开源的orm框架hibernate上。 我们可以利用ecache实现自定义缓存框架 首先自定义简单缓存访问接口SimpleCache publi...
  • zouqingfang
  • zouqingfang
  • 2016年02月25日 15:20
  • 2671

ehcache 实现缓存共享

公司项目最近在做缓存同步的工作,研发组高了一套zookeeper的插件,缓存存放在ehcache中,因为要依赖第三方插件,感觉很麻烦,ehcache本身就支持缓存同步且方式比较多。 如下样例简单实现两...
  • fujianianhua
  • fujianianhua
  • 2016年01月14日 17:19
  • 4219

springmvc+ecache

  • 2017年09月04日 11:28
  • 925KB
  • 下载

Ehcache整合spring配置

为了提高系统的运行效率,引入缓存机制,减少数据库访问和磁盘IO。下面说明一下ehcache和spring整合配置。...
  • clj198606061111
  • clj198606061111
  • 2014年11月14日 17:42
  • 34632

ecache的简单配置使用

Ehcache 与 spring 整合后的用法,下面是一个Ehcache.xml配置文件; 通用的缓存策略 可以用一个 cache; 1 xml version="1.0" enco...
  • lqqwonderful
  • lqqwonderful
  • 2017年05月27日 10:24
  • 254

Springboot集成ecache缓存配置

(1)在pom.xml中加入依赖包        在pom.xml文件中加入相应的依赖包,Spring Boot父节点依赖包;spring boot web支持;缓存依赖spring-context...
  • davis2015csdn
  • davis2015csdn
  • 2017年06月11日 15:10
  • 432

EhCache缓存学习

在看hibernate的官方文档时,看到关于缓存的介绍。 hibernate在缓存管理上做的很好,具体使用,本章不做讲解,本篇主要研究EhCache的用法。其中hibernate使用到的缓存提供商列...
  • lushuaiyin
  • lushuaiyin
  • 2013年04月18日 15:53
  • 2338

JAVA 中 Redis与ehcache对比与使用

第一:两者之间的介绍 Redis:属于独立的运行程序,需要单独安装后,使用JAVA中的Jedis来操纵。因为它是独立,所以如果你写个单元测试程序,放一些数据在Redis中,然后又写一个程序去拿数据,那...
  • shenbushen
  • shenbushen
  • 2016年08月07日 01:20
  • 19273

ehcache 缓存使用

一:详细配置步骤      1,添加ehcache.xml文件       将ehcache.xml文件添加到src路径下面。ehcache.xml文件内容如下 ...
  • lishuangzhe7047
  • lishuangzhe7047
  • 2014年12月02日 17:20
  • 40346

缓存之EHCache(一)

一、简介 非常简单,而且易用。     ehcache 是一个非常轻量级的缓存实现,而且从1.2 之后就支持了集群,而且是hibernate 默认的缓存provider。ehcache 是一个纯J...
  • l271640625
  • l271640625
  • 2014年03月05日 10:03
  • 39578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分布式Cache ecache
举报原因:
原因补充:

(最多只允许输入30个字)