- 浏览: 1010908 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
Xmemcached
一、 XMemcached 简介
XMemcached 是一个新 java memcached client 。也许你还不知道 memcached 是什么?可以先看看这里。简单来说, Memcached 是一个高性能的分布式内存对象的 key-value 缓存系统,用于动态 Web 应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用, memcached 通过它的自定义协议与客户端交互,而 XMemcached 就是它的一个 java 客户端实现。
二、 使用指南
2.1 简单例子
对于用户来说,最主要的功能是存取数据,假设我们有一个 memcached 节点 IP 地址或者域名是 host ,端口是 11211 ,一个简单的存取数据的例子如下:
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses (“localhost:11211”));
MemcachedClient memcachedClient = builder.build();
try {
memcachedClient. set ( "hello" , 0, "Hello,xmemcached" );
String value = memcachedClient. get ( "hello" );
System. out .println( "hello=" + value);
memcachedClient. delete ( "hello" );
value = memcachedClient.get( "hello" );
System. out .println( "hello=" + value);
} catch (MemcachedException e) {
System. err .println( "MemcachedClient operation fail" );
e.printStackTrace();
} catch (TimeoutException e) {
System. err .println( "MemcachedClient operation timeout" );
e.printStackTrace();
} catch (InterruptedException e) {
// ignore
}
try {
memcachedClient.shutdown();
} catch (IOException e) {
System. err .println( "Shutdown MemcachedClient fail" );
e.printStackTrace();
}
因为 XMemcachedClient 的创建有比较多的可选项,因此提供了一个 XMemcachedClientBuilder 用于构建 MemcachedClient 。 MemcachedClient 是主要接口,操作 memcached 的主要方法都在这个接口里, XMemcachedClient 是它的一个实现。传入的 memcached 节点列表要求是类似 ”host1:port1 host2:port2 …” 这样的字符串,通过 AddrUtil.getAddresses 方法获取实际的 IP 地址列表。存储数据是通过 set 方法,它有三个参数,第一个是存储的 key 名称,第二个是 expire 时间(单位秒) ,超过这个时间 ,memcached 将这个数据替换出去, 0 表示永久存储(默认是一个月) ,第三个参数就是实际存储的数据,可以是任意的 java 可序列化类型 。 获取存储的数据是通过 get 方法,传入 key 名称即可。如果要删除存储的数据,这是通过 delete 方法,它也是接受 key 名称作为参数。 XMemcached 由于是基于 nio ,因此通讯过程本身是异步的, client 发送一个请求给 memcached ,你是无法确定 memcached 什么时候返回这个应答,客户端此时只有等待,因此还有个等待超时的概念在这里。客户端在发送请求后,开始等待应答,如果超过一定时间就认为操作失败,这个等待时间默认是一秒,上面例子展现的 3 个方法调用的都是默认的超时时间,这三个方法同样有允许传入超时时间的重载方法,例如
Value=client.get(“hello”,3000);
就是等待 3 秒超时,如果 3 秒超时就跑出 TimeutException ,用户需要自己处理这个异常。因为等待是通过调用 CountDownLatch.await(timeout) 方法,因此用户还需要处理中断异常 InterruptException 。最后的 MemcachedException 表示 Xmemcached 内部发生的异常,如解码编码错误、网络断开等等异常情况。
2.2 CAS 操作
Memcached 是通过 cas 协议还实现原子更新,所谓原子更新就是 compare and set ,原理类似乐观锁,每次请求存储某个数据同时要附带一个 cas 值, memcached 比对这个 cas 值与当前存储数据的 cas 值是否相等,如果相等就让新的数据覆盖老的数据,如果不相等就认为更新失败,这在并发环境下特别有用。 XMemcached 提供了对 CAS 协议的支持(无论是文本协议还是二进制协议), CAS 协议其实是分为两个步骤:获取 CAS 值和尝试更新,因此一个典型的使用场景如下:
GetsResponse<Integer> result = client.gets( "a" );
long cas = result.getCas();
if (!client.cas( "a" , 0, 2, cas)) {
System. err .println( "cas error" );
}
首先通过 gets 方法获取一个 GetsResponse ,此对象包装了存储的数据和 cas 值,然后通过 cas 方法尝试原子更新,如果失败打印 ”cas error” 。显然,这样的方式很繁琐,并且如果你想尝试多少次原子更新就需要一个循环来包装这一段代码,因此 XMemcached 提供了一个 CASOpertion 接口包装了这部分操作,允许你尝试 N 次去原子更新某个 key 存储的数据,无需显式地调用 gets 获取 cas 值 , 上面的代码简化为:
client.cas( "a" , 0, new CASOperation<Integer>() {
public int getMaxTries() {
return 1;
}
public Integer getNewValue( long currentCAS, Integer currentValue) {
return 2;
}
});
CASOpertion 接口只有两个方法,一个是设置最大尝试次数的 getMaxTries 方法,这里是尝试一次,如果尝试超过这个次数将抛出一个 TimeoutException ,如果你想无限尝试,可以将返回值设定为 Integer.MAX_VALUE ;另一个方法是根据当前获得的 GetsResponse 来决定更新数据的 getNewValue 方法,如果更新成功,这个方法返回的值将存储成功,这个方法的两个参数是最新一次 gets 返回的 GetsResponse 结果。
2.3 更全面的例子
一些更全面的例子,展现了 MemcachedClient 接口的主要方法:
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses (“localhost:12000”));
MemcachedClient client = builder.build();
client.flushAll();
if (!client.set( "hello" , 0, "world" )) {
System. err .println( "set error" );
}
if (client.add( "hello" , 0, "dennis" )) {
System. err .println( "Add error,key is existed" );
}
if (!client.replace( "hello" , 0, "dennis" )) {
System. err .println( "replace error" );
}
client.append( "hello" , " good" );
client.prepend( "hello" , "hello " );
String name = client.get( "hello" , new StringTranscoder());
System. out .println(name);
client.deleteWithNoReply(“hello”);
首先存储了 hello 对应的 world 字符串,然后调用 add 和 replace 方法去尝试添加和替换,因为数据已经存在,因此 add 会失败,同样 replace 在数据存在的情况才会成功,也就是将 hello 对应的数据更新为 dennis ,然后通过 append 和 prepend 方法在 dennis 前后加上了字符串 hello 和 good ,因此通过 get 返回的结果是 hello dennis good 。而删除数据则是通过 deleteWithNoReply 方法,这个方法删除数据并且告诉 memcached 不用返回应答 ,因此这个方法不会等待应答直接返回,特别适合于批量处理;同样地, set 、 add 、 replace 等方法也有相应的 withNoReply 重载版本,具体请看 API 文档。
下面这个例子展现了 incr/decr 操作的使用,两个操作类似 java 中的原子类如 AtomicIntger ,用于原子递增或者递减变量数值:
assert (1== this . memcachedClient .incr( "a" , 5, 1));
assert (6== this . memcachedClient .incr( "a" , 5));
assert (10== this . memcachedClient .incr( "a" , 4));
assert (9== this . memcachedClient .decr( "a" , 1));
assert (7== this . memcachedClient .deccr( "a" , 2));
incr 和 decr 都有三个参数的方法,第一个参数指定递增的 key 名称,第二个参数指定递增的幅度大小,第三个参数指定当 key 不存在的情况下的初始值。两个参数的重载方法省略了第三个参数,默认指定为 0 。
Memcached 提供了统计协议用于查看统计信息:
Map<InetSocketAddress,Map<String,String>> result=client.getStats();
getStats 方法返回一个 map ,其中存储了所有已经连接并且有效的 memcached 节点返回的统计信息,你也可以统计具体的项目,如统计 items 项目:
Map<InetSocketAddress,Map<String,String>> result=client.getStatsByItem(“items”);
只要向 getStatsByItem 传入需要统计的项目名称即可。
MemcachedClientBuilder builder = new XmemcachedClientBuilder
(AddrUtil.getAddresses("10.180.44.224:11211 zhouxq:11211"),new int[]{1,3});
XMemcached 允许通过设置节点的权重来调节 memcached 的负载,设置的权重越高,该 memcached 节点存储的数据将越多,所承受的负载越大。
xmemcached 的权重是通过复制连接的多个引用来实现的,比如权重为 3 ,那么就复制 3 个同一个连接的引用放在集合中让 MemcachedSessionLocator 查找。
改变节点权重,可以通过 setServerWeight 方法:
public void setServerWeight(String server, int weight);
weight 与 servers 对应的节点的权重
weight 可以有也可无
weight 值大则权重大,否则小
传入一个 int 数组,里面的元素就是节点对应的权重值,比如这里设置 "10.180.44.224:1121" 节点的权重为 1 ,而 "zhouxq:11211" 的权重为 3 。
类似的 XMemcachedClient() 和 XMemcachedClientBuilder 相同
设置连接池大小
builder.setConnectionPoolSize(5);
与 Spring 框架集成
通过 XMemcachedClientFactoryBean 类,即可与 spring 框架集成
最简单例子
<bean name="memcachedClient" destroy-method="shutdown"
class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
<property name="servers">
<value>host1:port1 host2:port2</value>
</property>
</bean>
然后在 bean 中就可以使用 memcachedClient 了
复杂一点儿的例子
<bean name="memcachedClient" destroy-method="shutdown"
class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean">
<property name="servers">
<value>host1:port1 host2:port2 host3:port3</value>
</property>
<property name="weights">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="sessionLocator">
<bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"/>
</property>
<property name="transcoder">
<bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
</property>
<property name="bufferAllocator">
<bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator">
</property>
</bean>
其中各参数的意义:
参数 |
含义 |
servers |
服务器列表,格式: ip:port |
weights |
主机映射: host1 对应 1 号、 host2 对应 2 号 .. |
sessionLocator |
Session 分配器,有自带的,影响分布式 |
transcoder |
通信编码方式 |
bufferAllocator |
缓冲区分配器 |
发表评论
-
在CentOS 5.6上编译安装Memcached
2012-02-05 23:10 896首先上一个memcached原理图,让不了解memcached ... -
memcachedb应用:编译以及安装【转】
2011-04-26 21:25 888memcachedb跟memcache一样,网络socket数 ... -
[转]memcachedb 压力测试及调优【转】
2011-04-26 21:00 803一.需求: 我们希望找 ... -
轻量级持久存储系统 MemcacheDB (转载)
2011-04-26 19:53 829注:memcached可能简称mc,memcachedb可能简 ... -
MemcacheDB, Tokyo Tyrant, Redis performance test 性能测试【转】
2011-04-25 20:10 1136ming1016@gmail.com ... -
memcachedb内网测试报告之一:全写全读报告
2011-04-25 16:31 881当然此测试环境中的各组件并没有经过任务优化配置,全是采用官网默 ... -
memcachedb 安装笔记【转】
2011-04-25 16:11 9472010年06月18日 数据库 , 缓存系统 me ... -
Sina的开源项目:Memcachedb与NCache【转】
2011-04-25 15:21 1254http://hi.baidu.com/zeorliu/b ... -
初步测试memcachedb时碰到的问题
2011-04-25 15:18 1488今天在内网搭建memcachedb ... -
memcachedb应用指南一【转】
2011-04-25 13:31 723memcachedb应用指南一:为 ... -
linux安装memcachedb服务【转】
2011-04-25 12:53 1267memcached是一个不错的分布式内存缓存系统,并且提供丰富 ... -
轻量级持久存储系统 MemcacheDB 详细介绍【转】
2011-04-25 11:49 933注:memcached可能简称mc,memcachedb可能简 ... -
持久存储系统MemcacheDB的安装,配置 - [DB]【转】
2011-04-25 11:40 837memcachedb是什么 mcdb是一款分布式键值 ... -
memcachedb的缓存解决方案【转】
2011-04-25 11:37 650问题示例: 网站有千万个网页文件需要存储,占用空间大约有 ... -
memcachedb介绍、编译以及安装【转】
2011-04-25 10:51 485memcachedb 故名思义就是 ... -
试装memcachedb,整理了下安装过程【转】
2011-04-25 10:49 636文章作者:Enjoy 转载请注明原文链接。 ... -
XMemcached的类图和序列图[转]
2011-04-14 22:43 908XMemcached的结构方面的文档比较少,可能对有兴趣了解它 ... -
memcache Java客户端调用小例子
2011-04-12 17:47 948上篇文章(《Linux下memcache的安装 》)介绍 ... -
Linux下memcache的安装
2011-04-12 17:47 7502010-12-01 22:24 memcac ... -
java nio的memcached客户端--xmemcached
2011-04-12 17:15 26812010-11-06 02:16 1、xmemcach ...
相关推荐
**Xmemcached:分布式缓存解决方案** Xmemcached是一款基于Java编写的高性能、高...在使用Xmemcached时,结合其特性和版本1.3.3的优势,可以构建出可靠的分布式缓存系统,为大规模、高性能的应用场景提供有力支持。
以下是一段简单的XMemcached使用示例,展示如何建立连接、读写数据以及释放资源: ```java import com.google.code.yanf4j.core.Session; import com.google.code.yanf4j.util.IOUtils; import ...
xmemcached-1.2.4的官方源码。 xmemcached XMemcached is a high performance, easy to use blocking multithreaded memcached client in java. It's nio based (using my opensource nio framework :yanf4j), ...
这份手册不仅包含了基础的API使用方法,还涵盖了如何将Xmemcached与Spring等主流框架进行集成的详细配置信息。 **1. Xmemcached框架介绍** Xmemcached由Kafka Chen发起,设计目标是提供一个简单易用且高效的...
xmemcached是Java领域中一个高效、稳定且易于使用的Memcached客户端库,它为开发者提供了便捷的接口来操作Memcached服务器。在2.4.6这个版本中,xmemcached继续优化了性能和稳定性,为开发分布式缓存应用提供了强大...
在本文中,我们将详细探讨xmemcached的核心特性和使用方法,帮助开发者更好地理解和利用这个强大的工具。 首先,xmemcached的设计理念是简洁和高效。它采用了非阻塞I/O模型,基于NIO(New IO)框架,这使得...
xmemcached-1.2.6.2
xmemcached使用的jar,需要的可以下载
本文将深入探讨xmemcached的相关知识点,包括其特点、使用场景、API接口以及源代码分析。 ### 1. xmemcached的特点 - **高性能**:xmemcached采用了多线程并发模型,通过NIO(非阻塞I/O)优化网络通信,确保了在高...
`apidocs` 文件夹包含了 xmemcached 的 JavaDoc,是学习和使用 xmemcached 的重要参考资料。通过阅读文档,开发者可以详细了解每个类、接口、方法的用途和用法,更好地利用 xmemcached 实现高效的数据缓存功能。 ...
xmemcached.chm帮助文档
spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> ${XMemcached_servers} <!-- ...
这段代码展示了如何使用XMemcached客户端连接到本地运行的Memcached服务,然后存储和读取数据。通过这个简单的示例,我们可以看到XMemcached的易用性和高效性。 综上所述,XMemcached凭借其高性能、完整的协议支持...
测试类包括Xmemcached客户端与memcached client for java两者,可运行比较性能。 XMemcached简介: XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下...
总的来说,memcache.spymemcached和xmemcached都是Java开发人员在使用Memcached时的重要工具,它们为Java应用程序提供了高效的缓存解决方案。了解并掌握这些客户端的特性和用法,对于提升应用程序性能和优化系统架构...
基于java nio实现的高性能可扩展的memcached客户端。虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此...xmemcached的项目主页在:http://code.google.com/p/xmemcached/
xmemcached-1.4.2最新版,可用。memcached java客户端
xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务,使用RMI调用JMX服务的详细过程,完整的eclipse工程,直接导入即可用。还用一些运行截图,很有用。 自己写的例子,类名是BaseExample 和RMITest.