高性能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 nio实现的高性能可扩展的memcached客户端。它的主要特点: 高性能,稳定可靠,已经在众多公司的众多项目里得到应用。 功能完备:客户端分布式、权重、最新最完整的协议支持。 ...
Memcached的java客户端已经存在三种了:官方提供的基于传统阻塞io由Greg Whalin维护的客户端;Dustin Sallings实现的基于java nio的Spymemcached;XMemcached
2.spymemcached,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。 3.xmemcached,XMemcached也使用得比较广泛,而且...
XMemcached 是一个高性能、易用的 Java 阻塞多线程 memcached 客户端。 它基于 nio 并经过精心设计以获得最佳性能。 ##新闻和下载 。 Maven 依赖: <groupId>com.googlecode.xmemcached</groupId> ...
Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端交互,而XMemcached就是它的一个...
memcached 客户端 xmemcached jar 包,xmemcached 源文件 及 api
xmemcached-1.4.2最新版,可用。memcached java客户端
介绍XMemcached是Java中的一种高性能,易于使用的阻塞多线程memcached客户端。 它是基于nio的,并且经过了精心设计,以实现最佳性能。快速开始:有助于源代码并将其签出到本地计算机。 进行更改并创建拉取请求。 ...
类包括Xmemcached客户端实现和builder实现以及memcached client for java实现,对初学者有借鉴作用,特别是在开发简单例子时出现的超时情况的可以看看是否是同本事例相同。 xmemcached time out 5000 1000
XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞 IO为了提高效率,需要 创建一定数量的连接形成连接池,而 nio...
a.xmemcached b.java_memcached 参考链接:**一定要看,很详细的** http://tech.ddvip.com/2008-10/122405819878206.html ----------memcached服务器的安装与部署---------- 安装服务 D:\memcached-1.4.15>...
Java的memcached客户端,支持一致性hash算法,支持动态加服务器,减服务器
基于java nio实现的高性能可扩展的memcached客户端。虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此并不能够充分发挥Java NIO的性能优势.... xmemcached的项目主页...
java的memcached客户端,支持一致性hash,支持动态增删服务器,客户端源码
Sphere(分库分表)RocketMQ(消息队列)Lombok支持的功能文件上传下载Excel导入导出Memcached服务(Memcached-Java-Client和xmemcached两种client实现)Redis服务(Lettuce客户端,含常规操作、分布式锁和布隆过滤器整合...
谷歌对于memcached提供给Java的客户端有spymemcached、xmemcached、memcache-client-forjava等多种形式,但memcache-client-forjava是使用最多、最稳定的。里边的文件和文档(有中文文档)都是从官网下载的,里边的...
阿里ocs的java客户端demo,我测试了xmemcached和spymemcached。两个都可用,但xmc可以交由spring管理client对象的生命周期,而spymc却是spring...ocs spring xmemcached spymemcached(本机测试用memcached1.4.13版本)
cacheEhCacheUtils - 基于ehcache的工具类LruCacheUtils - 基于LinkedHashMap实现LRU缓存的工具类MemcachedUtils - 基于memcached的工具类XMemcachedUtils - 基于memcached的工具类(使用XMemcached客户端)Redis...