`
qianshangding
  • 浏览: 127890 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Memcached之客户端-xmemcached(5)

 
阅读更多

高性能Java memcached客户端——Xmemcached发布2.0.0版本,主要改进如下:

  1. 性能优化,在测试中文本协议实现有接近10%的性能提升。
  2. 批量获取key如果包含相同的key,会缓存反序列化后的对象,减少重复反序列化的CPU开销。
  3. 修复getStats没办法获取cache dump的Bug,感谢machao9email。
  4. 修复ONE_AT_A_TIME没有正确处理无符号数的Bug,感谢spudone。
  5. 使用纳秒时间戳作为namespace值,避免高并发下的namespace值冲突。


Maven依赖:

<dependency>
	<groupId>com.googlecode.xmemcached</groupId>
	<artifactId>xmemcached</artifactId>
	<version>2.0.0</version>
</dependency>

Spring + Xmemcached

<pre name="code" class="java">	<bean name="memcachedClient"
		class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
		<property name="servers">
			<!-- 服务器列表,格式:(ip:端口 ip:端口),多个以空格分割 -->
			<value>10.0.1.75:12000 10.0.1.76:12000 10.0.1.77:12000</value>
		</property>
		<!-- 和servers对应的节点的权重,weights是用来调节Memcached的负载,设置的权重越高,该Memcached节点存储的数据将越多,所承受的负载越大。 -->
		<property name="weights">
			<list>
				<value>1</value>
				<value>2</value>
				<value>3</value>
			</list>
		</property>

		<!-- nio连接池大小,默认一个Memcached节点只有一个连接池,通常条件是没有问题的。但是在典型的高并发环境下,nio的单连接也会遇到性能瓶颈。可通过调整连接池数量,<br> 
			当建立了多个连接到同一个Memcached节点,由于连接之间是不同步的,因此你的应用需要自己保证数据更新的同步 -->
		<property name="connectionPoolSize">
			<value>1</value>
		</property>

		<!-- 与服务器节点个数一致,密码不允许有空格 -->
		<property name="authInfoMap">
			<map>
				<entry key-ref="serverA">
					<bean class="net.rubyeye.xmemcached.auth.AuthInfo"
						factory-method="typical">
						<constructor-arg index="0">
							<value>memcached</value>
						</constructor-arg>
						<constructor-arg index="1">
							<value>123456</value>
						</constructor-arg>
					</bean>
				</entry>
				<entry key-ref="serverB">
					<bean class="net.rubyeye.xmemcached.auth.AuthInfo"
						factory-method="typical">
						<constructor-arg index="0">
							<value>memcached</value>
						</constructor-arg>
						<constructor-arg index="1">
							<value>123456</value>
						</constructor-arg>
					</bean>
				</entry>
				<entry key-ref="serverC">
					<bean class="net.rubyeye.xmemcached.auth.AuthInfo"
						factory-method="typical">
						<constructor-arg index="0">
							<value>memcached</value>
						</constructor-arg>
						<constructor-arg index="1">
							<value>123456</value>
						</constructor-arg>
					</bean>
				</entry>
			</map>
		</property>

		<!-- 分布策略,KetamaMemcachedSessionLocator(一致性哈希,增加主机时降低未命中率问题的解决); 
		还有实现了:ArrayMemcachedSessionLocator;ElectionMemcachedSessionLocator;
		LibmemcachedMemcachedSessionLocator;PHPMemcacheSessionLocator -->
		<property name="sessionLocator">
			<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator" />
		</property>
		<!-- 序列化转换器 -->
		<property name="transcoder">
			<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
		</property>
		<!-- IoBuffer分配器(内容写入memcached时的内存控制策略) -->
		<property name="bufferAllocator">
			<bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator" />
		</property>
		<!-- 协议工厂net.rubyeye.xmemcached.command.BinaryCommandFactory(二进制),TextCommandFactory(文本),KestrelCommandFactory(可靠获取),本应用配置二进制方式 -->
		<property name="commandFactory">
			<bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory" />
		</property>
	</bean>

	<bean name="serverA" class="java.net.InetSocketAddress">
		<constructor-arg>
			<value>10.0.1.75</value>
		</constructor-arg>
		<constructor-arg>
			<value>12000</value>
		</constructor-arg>
	</bean>

	<bean name="serverB" class="java.net.InetSocketAddress">
		<constructor-arg>
			<value>10.0.1.76</value>
		</constructor-arg>
		<constructor-arg>
			<value>12000</value>
		</constructor-arg>
	</bean>

	<bean name="serverC" class="java.net.InetSocketAddress">
		<constructor-arg>
			<value>10.0.1.77</value>
		</constructor-arg>
		<constructor-arg>
			<value>12000</value>
		</constructor-arg>
	</bean>


调用

@Resource
public MemcachedClient memcachedClient;

 public void testString() {
  try {
   for (int i = 1024; i < 1024 * 2; i++) {
    memcachedClient.set("zy" + i, 0, i);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

更多Memcached操作,请查看Memcached之存储命令(2),然后在Xmemcached客户端找对应的方法。

Java API调用

查看:https://github.com/killme2008/xmemcached

        @Test
	public void javaExample() throws MemcachedException, InterruptedException, TimeoutException, IOException {
		XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:11211"));
		builder.setCommandFactory(new BinaryCommandFactory());
		builder.setCommandFactory(new KestrelCommandFactory());
		XMemcachedClient client = (XMemcachedClient) builder.build();

		client.setPrimitiveAsString(true);

		client.addServer("10.0.1.75:12000 10.0.1.76:12000");
		client.removeServer("10.0.1.75:12000 10.0.1.76:12000");

		// get operation
		String name = client.get("test");

		// set add replace append prepend gets
		client.add("hello", 0, "dennis");
		client.replace("hello", 0, "dennis");
		client.append("hello", " good");
		client.prepend("hello", "hello ");
		GetsResponse response = client.gets("hello");
		long cas = response.getCas();
		Object value = response.getValue();

		// incr decr
		client.set("a", 0, "1");
		client.incr("a", 4);
		client.decr("a", 4);

		// cas
		client.cas("a", 0, new CASOperation() {
			@Override
			public int getMaxTries() {
				return 1; // max try times
			}

			@Override
			public Object getNewValue(long currentCAS, Object currentValue) {
				System.out.println("current value " + currentValue);
				return 3; // return new value to update
			}
		});

		// flush_all
		client.flushAll();

		// stats
		Map<InetSocketAddress, Map<String, String>> result = client.getStats();

		// get server versions
		Map<InetSocketAddress, String> version = client.getVersions();

		// bulk get
		List<String> keys = new ArrayList<String>();
		keys.add("hello");
		keys.add("test");
		Map<String, Object> map = client.get(keys);
	}

常见问题

如果启动的协议是二进制的,必须在Spring配置文件指定(xmemcached默认的协议是:net.rubyeye.xmemcached.command.TextCommandFactory),不然会打印如下异常:

net.rubyeye.xmemcached.exception.MemcachedException: Session has been closed
    at net.rubyeye.xmemcached.impl.MemcachedTCPSession.destroy(MemcachedTCPSession.java:111)
    at net.rubyeye.xmemcached.impl.MemcachedHandler.onSessionClosed(MemcachedHandler.java:164)
    at com.google.code.yanf4j.core.impl.AbstractSession.onClosed(AbstractSession.java:306)
    at com.google.code.yanf4j.core.impl.AbstractSession.close(AbstractSession.java:294)
    at com.google.code.yanf4j.nio.impl.NioTCPSession.decode(NioTCPSession.java:311)
    at com.google.code.yanf4j.nio.impl.NioTCPSession.decodeAndDispatch(NioTCPSession.java:237)
    at com.google.code.yanf4j.nio.impl.NioTCPSession.readFromBuffer(NioTCPSession.java:207)
    at com.google.code.yanf4j.nio.impl.AbstractNioSession.onRead(AbstractNioSession.java:196)
    at com.google.code.yanf4j.nio.impl.AbstractNioSession.onEvent(AbstractNioSession.java:341)
    at com.google.code.yanf4j.nio.impl.SocketChannelController.dispatchReadEvent(SocketChannelController.java:56)
    at com.google.code.yanf4j.nio.impl.NioController.onRead(NioController.java:157)
    at com.google.code.yanf4j.nio.impl.Reactor.dispatchEvent(Reactor.java:323)
    at com.google.code.yanf4j.nio.impl.Reactor.run(Reactor.java:180)
常见问题会持续更新。。。

分享到:
评论

相关推荐

    memcached客户端所需jar包

    Xmemcached是一个高性能、线程安全的Java Memcached客户端,它支持异步操作,提供全面的API和配置选项。版本号2.6.6表明这是该客户端的一个具体发行版。 使用这些客户端库时,开发者需要理解以下关键概念和API: -...

    memcached客户端(三种客户端)

    在Java开发中,有三种主流的Memcached客户端库供开发者选择:官方的基于传统阻塞IO的客户端、Dustin Sallings实现的基于Java NIO的Spymemcached以及XMemcached。 1. **官方客户端** 官方提供的客户端是由Greg ...

    memcached java client

    本篇文章将详细介绍两个常用的Java Memcached客户端:xmemcached和memcache-client-forjava。 **1. xmemcached** xmemcached是由Ketoo开发的一个高性能、高可用性的Java Memcached客户端。它提供了丰富的API,支持...

    Java的开源高性能memcached客户端XMemcached.zip

    Xmemcached是基于java nio实现的高性能可扩展的memcached客户端。它的主要特点: 高性能,稳定可靠,已经在众多公司的众多项目里得到应用。 功能完备:客户端分布式、权重、最新最完整的协议支持。 ...

    memcached-win64-1.4.4-14下载,无需积分

    这些库如Spymemcached、Xmemcached和Memcached-Java-Client等,允许Java应用无缝地连接到Memcached服务器,实现数据的快速存取。 **3. 64位Windows兼容** "win64"表明这个版本的Memcached是专为64位Windows操作...

    memcached客户端和服务端程序和jar包

    XMemcached 是另一个流行的 Memcached Java 客户端,它提供了更丰富的功能,如支持多线程、异步操作等。在项目中引入 XMemcached 的 JAR 包: ```xml &lt;groupId&gt;com.googlecode.xmemcached&lt;/groupId&gt; ...

    memcached的三种java客户端jar

    2.spymemcached,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。 3.xmemcached,XMemcached也使用得比较广泛,而且...

    strom-xmemcached:Strom版Xmemcached客户端

    XMemcached 是一个高性能、易用的 Java 阻塞多线程 memcached 客户端。 它基于 nio 并经过精心设计以获得最佳性能。 ##新闻和下载 。 Maven 依赖: &lt;groupId&gt;com.googlecode.xmemcached&lt;/groupId&gt; ...

    xmemcached jar包,源文件,api

    **xmemcached:高效、强大的Memcached客户端** xmemcached是一个高性能、易用且功能丰富的Java Memcached客户端库。它提供了全面的API,使得开发者能够方便地与Memcached缓存系统进行交互,从而提高Web应用的性能和...

    j2ee项目使用filter和memcached实现session服务器

    此时,使用Memcached客户端创建一个新的session ID,并将相关数据存储在Memcached中。 5. **会话超时和清理**:在Memcached中,你需要设定每个session的过期时间。同时,可以在后台定期执行任务,清除已过期的...

    memcached客户端

    Memcached客户端是分布式内存缓存系统Memcached与应用程序交互的重要组成部分。这个系统广泛应用于Web开发,用于减轻数据库负载,提高网站性能。Memcached通过在内存中存储数据,提供快速的数据访问,尤其适用于处理...

    内存缓存服务器(memcached)客户端比较报告[收集].pdf

    总的来说,这份报告提供了深入的比较分析,有助于理解Memcached客户端的性能特性,并为开发人员选择合适的客户端提供依据。在设计分布式系统,特别是云环境中的系统时,选择正确的客户端可以显著提升系统的整体效率...

    tomcat-memcached所需jar包

    综上所述,要实现Tomcat与Memcached的集成,我们需要下载合适的Memcached客户端jar包,将其放入Tomcat的`lib`目录,并正确配置客户端连接参数。然后,通过编程接口存取缓存数据,进行性能测试和调优,以确保系统的...

    memcached-amd64.rar

    `memcached`相关的`jar`文件通常包含与`memcached`交互的Java客户端库,如`spymemcached`或`xmemcached`。这些库提供了方便的API,使得Java开发者可以轻松地连接到`memcached`服务器,执行添加、删除、更新和查询...

    xmemcached-1.4.2

    xmemcached-1.4.2最新版,可用。memcached java客户端

    xmemcached-1.4.3.jar

    总的来说,xmemcached-1.4.3.jar作为一款强大的Memcached客户端,不仅提供了高效的缓存操作,还具备优秀的扩展性和健壮的错误处理机制,是构建大规模分布式系统中不可或缺的一部分。通过深入了解和熟练运用,开发者...

    Memcached Demo 01.zip

    在这个"Memcached Demo 01.zip"项目中,开发者可能使用了诸如 `spymemcached` 或 `xmemcached` 这样的 Java 客户端库。这些库提供了简单的 API,使得开发者能够方便地执行添加、删除、更新和检索缓存中的对象。 **...

    memcached

    - 对于`java_memcached-release_2.5.1.jar`的源码分析,可以深入了解Memcached客户端的实现细节,包括连接管理、命令发送、结果接收等。 - 这有助于优化代码性能,比如了解如何设置合适的超时时间,如何处理网络...

    Xmemcached用户指南

    XMemcached是一款针对Java平台设计的高性能Memcached客户端。Memcached是一种分布式内存对象缓存系统,主要用于减轻数据库负担,提高动态Web应用程序的响应速度。随着技术的发展,Memcached也被用作内存式数据库。该...

Global site tag (gtag.js) - Google Analytics