高性能Java memcached客户端——Xmemcached发布2.0.0版本,主要改进如下:
- 性能优化,在测试中文本协议实现有接近10%的性能提升。
- 批量获取key如果包含相同的key,会缓存反序列化后的对象,减少重复反序列化的CPU开销。
- 修复getStats没办法获取cache dump的Bug,感谢machao9email。
- 修复ONE_AT_A_TIME没有正确处理无符号数的Bug,感谢spudone。
- 使用纳秒时间戳作为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)
常见问题会持续更新。。。
分享到:
相关推荐
Xmemcached是一个高性能、线程安全的Java Memcached客户端,它支持异步操作,提供全面的API和配置选项。版本号2.6.6表明这是该客户端的一个具体发行版。 使用这些客户端库时,开发者需要理解以下关键概念和API: -...
在Java开发中,有三种主流的Memcached客户端库供开发者选择:官方的基于传统阻塞IO的客户端、Dustin Sallings实现的基于Java NIO的Spymemcached以及XMemcached。 1. **官方客户端** 官方提供的客户端是由Greg ...
本篇文章将详细介绍两个常用的Java Memcached客户端:xmemcached和memcache-client-forjava。 **1. xmemcached** xmemcached是由Ketoo开发的一个高性能、高可用性的Java Memcached客户端。它提供了丰富的API,支持...
Xmemcached是基于java nio实现的高性能可扩展的memcached客户端。它的主要特点: 高性能,稳定可靠,已经在众多公司的众多项目里得到应用。 功能完备:客户端分布式、权重、最新最完整的协议支持。 ...
这些库如Spymemcached、Xmemcached和Memcached-Java-Client等,允许Java应用无缝地连接到Memcached服务器,实现数据的快速存取。 **3. 64位Windows兼容** "win64"表明这个版本的Memcached是专为64位Windows操作...
XMemcached 是另一个流行的 Memcached Java 客户端,它提供了更丰富的功能,如支持多线程、异步操作等。在项目中引入 XMemcached 的 JAR 包: ```xml <groupId>com.googlecode.xmemcached</groupId> ...
2.spymemcached,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。 3.xmemcached,XMemcached也使用得比较广泛,而且...
XMemcached 是一个高性能、易用的 Java 阻塞多线程 memcached 客户端。 它基于 nio 并经过精心设计以获得最佳性能。 ##新闻和下载 。 Maven 依赖: <groupId>com.googlecode.xmemcached</groupId> ...
**xmemcached:高效、强大的Memcached客户端** xmemcached是一个高性能、易用且功能丰富的Java Memcached客户端库。它提供了全面的API,使得开发者能够方便地与Memcached缓存系统进行交互,从而提高Web应用的性能和...
此时,使用Memcached客户端创建一个新的session ID,并将相关数据存储在Memcached中。 5. **会话超时和清理**:在Memcached中,你需要设定每个session的过期时间。同时,可以在后台定期执行任务,清除已过期的...
Memcached客户端是分布式内存缓存系统Memcached与应用程序交互的重要组成部分。这个系统广泛应用于Web开发,用于减轻数据库负载,提高网站性能。Memcached通过在内存中存储数据,提供快速的数据访问,尤其适用于处理...
总的来说,这份报告提供了深入的比较分析,有助于理解Memcached客户端的性能特性,并为开发人员选择合适的客户端提供依据。在设计分布式系统,特别是云环境中的系统时,选择正确的客户端可以显著提升系统的整体效率...
综上所述,要实现Tomcat与Memcached的集成,我们需要下载合适的Memcached客户端jar包,将其放入Tomcat的`lib`目录,并正确配置客户端连接参数。然后,通过编程接口存取缓存数据,进行性能测试和调优,以确保系统的...
`memcached`相关的`jar`文件通常包含与`memcached`交互的Java客户端库,如`spymemcached`或`xmemcached`。这些库提供了方便的API,使得Java开发者可以轻松地连接到`memcached`服务器,执行添加、删除、更新和查询...
xmemcached-1.4.2最新版,可用。memcached java客户端
总的来说,xmemcached-1.4.3.jar作为一款强大的Memcached客户端,不仅提供了高效的缓存操作,还具备优秀的扩展性和健壮的错误处理机制,是构建大规模分布式系统中不可或缺的一部分。通过深入了解和熟练运用,开发者...
在这个"Memcached Demo 01.zip"项目中,开发者可能使用了诸如 `spymemcached` 或 `xmemcached` 这样的 Java 客户端库。这些库提供了简单的 API,使得开发者能够方便地执行添加、删除、更新和检索缓存中的对象。 **...
- 对于`java_memcached-release_2.5.1.jar`的源码分析,可以深入了解Memcached客户端的实现细节,包括连接管理、命令发送、结果接收等。 - 这有助于优化代码性能,比如了解如何设置合适的超时时间,如何处理网络...
XMemcached是一款针对Java平台设计的高性能Memcached客户端。Memcached是一种分布式内存对象缓存系统,主要用于减轻数据库负担,提高动态Web应用程序的响应速度。随着技术的发展,Memcached也被用作内存式数据库。该...