`
susiya
  • 浏览: 91096 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Gemfire 6.5 缓存之服务器管理模式分析

阅读更多
GemFire 客服端/服务器 缓存模式能提供动态的服务器连接池管理,均衡和有条件的服务器加载,逻辑的服务器组管理,以及对高效性服务器的自动失效备援。

和以往旧版本的GemFire相比,在分布式系统的连接管理中,旧版本是采用DistributedSystem类进行连接管理。最新版本提供了CacheServer 和 CacheClient类实现客户端/服务器模式。以下是一个简单的例子:

服务器配置:
1.Server.xml
<?xml version="1.0"?>

<!-- Server.xml
     Configures a cache to serve caching clients at port 40405.
     The example region also is configured with a loader. 
-->

<!DOCTYPE cache PUBLIC
  "-//GemStone Systems, Inc.//GemFire Declarative Caching 6.5//EN"
  "http://www.gemstone.com/dtd/cache6_5.dtd">
<cache>
    <cache-server port="40404"/>
    <region name="exampleRegion">
      <region-attributes refid="REPLICATE">
        <cache-loader>
          <class-name>quickstart.SimpleCacheLoader</class-name>
        </cache-loader>
      </region-attributes>
    </region>
</cache>


2.服务器在这里使用的是GemFire cacheserver 进程。

客户端配置:

1. Client.xml
<client-cache>
	<pool name="client" subscription-enabled="true">
		<server host="localhost" port="40404" />
	</pool>

	<region name="exampleRegion">
		<region-attributes refid="CACHING_PROXY">
			<cache-listener>
				<class-name>quickstart.SimpleCacheListener</class-name>
			</cache-listener>
		</region-attributes>
	</region>
</client-cache>


2. ClientWorker.java,该类用于往cache中get和put数据。
public class ClientWorker {

	public static final String EXAMPLE_REGION_NAME = "exampleRegion";

	public static void main(String[] args) throws Exception {

		System.out.println("Connecting to the distributed system and creating the cache.");
		// Create the cache which causes the cache-xml-file to be parsed
		ClientCache cache = new ClientCacheFactory()
                  .set("name", "ClientWorker")
                  .set("cache-xml-file", "xml/Client.xml")
                  .create();

		// Get the exampleRegion
		Region<String, String> exampleRegion = cache.getRegion(EXAMPLE_REGION_NAME);
		System.out.println("Example region \"" + exampleRegion.getFullPath() + "\" created in cache.");
		System.out.println();
		System.out.println("Getting three values from the cache server.");
		System.out.println("This will cause the server's loader to run, which will add the values");
		System.out.println("to the server cache and return them to me. The values will also be");
		System.out.println("forwarded to any other client that has subscribed to the region.");

		// Get three values from the cache
		for (int count = 0; count < 3; count++) {
			String key = "key" + count;
			System.out.println("Getting key " + key);
			exampleRegion.get(key);
		}

		System.out.println("Note the other client's region listener in response to these gets.");
		System.out.println("Press Enter to continue.");
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		bufferedReader.readLine();

		System.out.println("Changing the data in my cache - all destroys and updates are forwarded");
		System.out.println("through the server to other clients. Invalidations are not forwarded.");

		// Update one value in the cache
		System.out.println("Putting new value for key0");
		exampleRegion.put("key0", "ClientValue0");

		// Invalidate one entry in the cache
		System.out.println("Invalidating key1");
		exampleRegion.invalidate("key1");

		// Destroy one entry in the cache
		System.out.println("Destroying key2");
		exampleRegion.destroy("key2");

		// Close the cache and disconnect from GemFire distributed system
		System.out.println("Closing the cache and disconnecting.");
		cache.close();

		System.out.println("In the other session, please hit Enter in the Consumer client");
		System.out.println("and then stop the cacheserver with 'cacheserver stop'.");
	}
}


3. ClientConsumer.java,模拟从server端获取数据。
public class ClientConsumer {

	public static final String USAGE = "Usage: java ClientConsumer <register-interest-type>\n"
			+ "  register-interest-type may be one of the following:\n"
			+ "    all-keys    Register interest in all keys on the server\n"
			+ "    keyset      Register interest in a set of keys on the server\n"
			+ "    regex       Register interest in keys on the server matching a regular expression\n";

	public static final String EXAMPLE_REGION_NAME = "exampleRegion";

	private static enum RegisterInterestType {
		ALL_KEYS, KEYSET, REGEX
	}

	public static void main(String[] args) throws Exception {

		if (args.length != 1) {
			System.out.println(USAGE);
			System.exit(1);
		}

		RegisterInterestType registerInterestType;
		if (args[0].equals("all-keys")) {
			registerInterestType = RegisterInterestType.ALL_KEYS;
		} else if (args[0].equals("keyset")) {
			registerInterestType = RegisterInterestType.KEYSET;
		} else if (args[0].equals("regex")) {
			registerInterestType = RegisterInterestType.REGEX;
		} else {
			registerInterestType = null;
			System.out.println(USAGE);
			System.exit(2);
		}

		// Subscribe to the indicated key set
		System.out.println("Connecting to the distributed system and creating the cache.");
		// Create the cache which causes the cache-xml-file to be parsed
		ClientCache cache = new ClientCacheFactory()
                  .set("name", "ClientConsumer")
                  .set("cache-xml-file", "xml/Client.xml")
                  .create();

		// Get the exampleRegion which is a subregion of /root
		Region<String,?> exampleRegion = cache.getRegion(EXAMPLE_REGION_NAME);
		System.out.println("Example region \"" + exampleRegion.getFullPath() + "\" created in cache. ");

		switch (registerInterestType) {
		case ALL_KEYS:
			System.out.println("Asking the server to send me all data additions, updates, and destroys. ");
			exampleRegion.registerInterest("ALL_KEYS");
			break;
		case KEYSET:
			System.out.println("Asking the server to send me events for data with these keys: 'key0', 'key1'");
			exampleRegion.registerInterest("key0");
			exampleRegion.registerInterest("key1");
			break;
		case REGEX:
			System.out.println("Asking the server to register interest in keys matching this");
			System.out.println("regular expression: 'k.*2'");
			exampleRegion.registerInterestRegex("k.*2");
			break;
		default:
			// Can't happen
			throw new RuntimeException();
		}

		System.out.println("The data region has a listener that reports all changes to standard out.");
		System.out.println();
		System.out.println("Please run the worker client in another session. It will update the");
		System.out.println("cache and the server will forward the updates to me. Note the listener");
		System.out.println("output in this session.");
		System.out.println();
		System.out.println("When the other client finishes, hit Enter to exit this program.");

		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		bufferedReader.readLine();

		System.out.println("Closing the cache and disconnecting.");
		cache.close();
	}
}


4. SimpleCacheLoader.java,如果该Region在服务器端没有数据,将自动加载数据。
public class SimpleCacheLoader implements CacheLoader<String,String>, Declarable {
  
  public String load(LoaderHelper<String,String> helper) {
    String key = helper.getKey();
    System.out.println("    Loader called to retrieve value for " + key);
    
    // Create a value using the suffix number of the key (key1, key2, etc.)
    return "LoadedValue" + (Integer.parseInt(key.substring(3)));
  }
  
  public void close() {
    // do nothing
  }
  
  public void init(Properties props) {
    // do nothing
  }
}



5. SimpleCacheListener.java,一个异步的监听器用于监听本地缓存的变化。
public class SimpleCacheListener<K,V> extends CacheListenerAdapter<K,V> implements Declarable {

  public void afterCreate(EntryEvent<K,V> e) {
    System.out.println("    Received afterCreate event for entry: " +
      e.getKey() + ", " + e.getNewValue());
  }
  
  public void afterUpdate(EntryEvent<K,V> e) {
    System.out.println("    Received afterUpdate event for entry: " +
      e.getKey() + ", " + e.getNewValue());
  }
  
  public void afterDestroy(EntryEvent<K,V> e) {
    System.out.println("    Received afterDestroy event for entry: " +
      e.getKey());
  }

  public void afterInvalidate(EntryEvent<K,V> e) {
    System.out.println("    Received afterInvalidate event for entry: " +
      e.getKey());
  }

  public void afterRegionLive(RegionEvent e) {
    System.out.println("    Received afterRegionLive event, sent to durable clients after \nthe server has finished replaying stored events.  ");
  }

  public void init(Properties props) {
    // do nothing
  }

}



启动步骤:
1. 启动GemFire cacheserver:
cacheserver start cache-xml-file=xml/Server.xml


2. 启动customer client:
java quickstart.ClientConsumer all-keys


3. 启动ClientWorker:
java quickstart.ClientWorker


4. 当所有客户端退出后,停止cacheserver:
cacheserver stop


本文摘自:http://community.gemstone.com/display/gemfire/Server-Managed+Caching+Example
0
0
分享到:
评论

相关推荐

    GemFire学习指南

    2. 创建缓存:可以在GemFire对等体上创建缓存,缓存管理着到其他GemFire对等体的连接。 3. 创建Region:可以创建Region,Region是一个分布式系统之上的抽象概念,可以提供高性能的数据访问能力。 4. 使用Region:...

    io.pivotal.gemfire - 9.1.1.jar files for springboot-gemfire

    2. **配置Gemfire**:在SpringBoot的application.properties或application.yml文件中,配置Gemfire的相关参数,如服务器地址、端口、缓存大小等。 3. **创建数据区域**:Gemfire中的数据是以“地区”(Region)的...

    gemfire简单搭建

    这将启动一个名为 `server1` 的服务器,连接到 `locator1` 定位器,使用 `/etc/gphd/GemFire/SampleCode/quickstart/xml/Server.xml` 文件作为缓存配置文件,并设置 Java 虚拟机参数为 `-Xmx8192m` 和 `-Xms8192m`。...

    Gemfire pdf入门手册

    1. 支持配置,涵盖了主机机器要求、对Linux RPM包的依赖以及在纯Java模式下运行GemFire的要求。 2. vFabric GemFire工具支持配置,包括GemFire Pulse、Data Browser和VSD的系统要求。 3. vFabric GemFire本地客户端...

    gemfire 7.0

    【标题】"gemfire 7.0" 是一款强大的分布式内存数据网格系统,主要用于处理大规模数据的高速缓存和分布式计算。此版本是vFabric GemFire的重要升级,它旨在提供更高效、更可靠的企业级解决方案。 【描述】"gemfire ...

    gemfire 用户手册-英文

    通过上述分析可以看出,《gemfire用户手册》是一份全面的技术文档,不仅详细介绍了gemfire的功能特性和安装步骤,还涵盖了配置要求、系统兼容性以及使用指南等多个方面,为gemfire的使用者提供了全面的支持。

    org.antczak.gemfire:GemFire 客户端服务器

    基于 Spring Boot 的 GemFire 客户端/服务器如何运行: 常见: mvn install -pl domain 服务器: mvn spring-boot:run -pl server (最多 3 个服务器) 客户端: mvn test -pl client

    gemfire os conf

    GemFire 系统由多个“成员”组成,每个成员可以是服务器、客户端、 locator 或者管理节点。Locators 负责引导其他成员加入集群,而服务器则存储和处理数据。客户端连接到 locators 获取数据服务。配置这些组件之间的...

    GemFire 入门指导

    - **缓存**: 在每个VM上创建的缓存负责管理与其他VM对等体之间的连接。 - **发现机制**: 通过UDP多播或TCP位置服务进行成员间的自动发现。 #### 三、GemFire 区域 (Regions) **区域** 是GemFire中用于存储数据的...

    Gemfire指导手册

    Gemfire的核心优势之一在于其强大的集群管理能力。通过合理的集群配置,可以实现数据的自动分区、备份和恢复等功能。 1. **集群配置服务**:提供了一套完善的集群配置管理工具,使得集群的创建、管理和监控变得更加...

    GemFire 学习笔记

    GemFire 架构基于 Peer-to-Peer 模式,所有节点都是对等的,可以作为数据的存储和检索点。节点之间通过网络通信,实现数据的同步和分布。主要组件包括: - **成员(Members)**: 每个运行 GemFire 的实例称为一个...

    Pivotal Gemfire 9.3 文档 (pdf)

    - **运行GemFire服务器进程**:执行实际的数据存储和处理任务。 - **管理系统输出文件**:包括日志文件和其他输出记录。 #### 六、技术支持与系统要求 - **技术支持**:提供官方的技术支持渠道。 - **支持的配置和...

    gemfire安装配置手册

    GemFire 是 VMware 公司的一款高效数据管理解决方案,它提供了数据分布、缓存以及内存计算功能,以应对高并发和大数据量的挑战。在传统的数据库系统难以满足现代应用需求的情况下,GemFire 作为一款内存数据网格(In...

    GemFire8.2 windows版本

    2.命令行管理员运行 gfsh 3.按http://gemfire.docs.pivotal.io/docs-gemfire/latest/getting_started/15_minute_quickstart_gfsh.html#topic_FE3F28ED18E145F787431EC87B676A76 上进行操作 4.打开REST 格式 ...

    GemFire:对GemFire 源码进行分析

    本站点主要是对 gemfire.org 网站的博文进行归档, 主要包括 gemfire 入门,基本特性和高级特性讲解,以及gemfire源码分析等. Overview gemfire基本特性 gemfire高级特性 gemfire源码分析

    Pivotal_GemFire

    GemFire Enterprise能够作为关键值存储,并支持并发访问,适合于多种业务场景,如订单处理、会话状态管理、缓存等。 GemFire的一个重要特性是其SQLFire组件,它引入了SQL接口,使得用户可以使用SQL语言来操作内存中...

    spring-data-gemfire-1.3.4.RELEASE.zip

    Spring Data GemFire提供了高级数据访问和管理功能,使得开发人员能够利用GemFire的强大功能,如分布式缓存、数据分区、事件监听和事务处理,来构建高性能、高可用的应用程序。 Spring Data GemFire的主要特性包括...

    gemfire、geode多节点集群部署踩坑大全.docx

    GemFire/Geode 是一种分布式内存对象管理系统,广泛应用于大型企业级应用中。然而,在实际部署中,遇到的一些坑和难点,会导致部署失败或效率不高。以下是 GemFire/Geode 多节点集群部署踩坑大全,旨在帮助新学习 ...

    GemFire高负载架构设计.pptx

    - 客户端嵌入:GemFire采用C/S架构,Web应用程序通过嵌入GemFire客户端来读写数据,客户端负责与GemFire服务器同步操作。 - 协调器机制:GemFire客户端通过协调器连接到合适的服务器,提高数据访问效率,并通过HA...

Global site tag (gtag.js) - Google Analytics