Memcachedclient-XMemcached使用
一、 XMemcached 简单介绍
XMemcached 是一个新
java memcached client 。
或许你还不知道 memcached 是什么?能够先看看这里。简单来说, Memcached 是一个高性能的分布式内存对象的 key-value 缓存系统,用于动态 Web 应用以减轻数据库负载,如今也有非常多人将它作为内存式数据库在使用, memcached 通过它的自己定义协议与客户端交互,而XMemcached
就是它的一个 java
client实现。
二、 使用指南
2.1 简单样例
对于用户来说,最基本的功能是存取数据,如果我们有一个 memcached 节点 IP 地址或者域名是 host 。port是 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
表示永久存储(默认是一个月) 。第三个參数就是实际存储的数据,能够是随意的 java
可序列化类型 。 获取存储的数据是通过 get 方法,传入 key 名称就可以。假设要删除存储的数据,这是通过 delete 方法,它也是接受 key 名称作为參数。 XMemcached 因为是基于 nio 。因此通讯过程本身是异步的。 client 发送一个请求给 memcached ,你是无法确定 memcached 什么时候返回这个应答,client此时仅仅有等待,因此还有个等待超时的概念在这里。client在发送请求后。開始等待应答,假设超过一定时间就觉得操作失败,这个等待时间默认是一秒,上面样例展现的
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, newCASOperation<Integer>() {
public int
getMaxTries() {
return1;
}
publicInteger getNewValue(
longcurrentCAS, 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"
, newStringTranscoder());
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 。
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);
Memcachedclient-XMemcached使用的更多相关文章
- Xmemcached的FAQ和性能调整建议
转载 http://www.blogjava.net/killme2008/archive/2014/02/13/325564.html 一.XMemcached是什么?经常碰到的一个问题是很多朋友对 ...
- xmemcached的使用
转载 http://www.voidcn.com/blog/u010408365/article/p-4972896.html xmemcached主要特性 高性能 XMemcached同样是基于ja ...
- 02.XMemcached的使用
关于XMemcached的介绍或文档请参考:https://code.google.com/p/xmemcached/wiki/User_Guide_zh 关于Memcached的命令 ...
- XMemcached使用示例--转
Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached通过它的自定义协议与客户端 ...
- xmemcached user guide --存档
XMemcached Introduction XMemcached is a new java memcached client. Maybe you don't know "memcac ...
- Error creating bean with name 'memcachedClient'...java.lang.OutOfMemoryError
1,Tomcat启动报错例如以下: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating ...
- XMemcached简单使用示例
Memcached的Java客户端目前有三个: Memcached Client for Java 比 SpyMemcached更稳定.更早.更广泛: SpyMemcached 比 Memcached ...
- spring aop + xmemcached 配置service层缓存策略
Memcached 作用与使用 基本介绍 1,对于缓存的存取方式,简言之,就是以键值对的形式将数据保存在内存中.在日常业务中涉及的操作无非就是增删改查.加入缓存机制后,查询的时候,对数据进行缓存,增删 ...
- Xmemcached学习笔记
memcached有三种java客户端 第一种:Com.danga 包下面的memcached,需引入jar(本人用的是memcached-2.5.2.jar 文末附上附件需要的可以下载) 第二种:s ...
- 第七章 Xmemcached客户端介绍
提示:有关于XMemcached在实际开发中的具体使用,查看"Java企业项目开发实践"系列博客的<第八章 企业项目开发--分布式缓存memcached> 注意:本文主 ...
随机推荐
- mormot当作内存数据库(缓存)使用
mormot当作内存数据库(缓存)使用 mormot的TSQLRestStorageInMemory可以作为内存数据库来使用. 上图是在笔者4代I5笔记本上做的测试,增加10万记录,耗时:562毫秒. ...
- wireshark提取gzip格式的html
原文地址:http://blog.csdn.net/vah101/article/details/44102501 首先使用wireshark启动抓包,然后以百度为例,访问百度的首页,之后停止抓包,w ...
- 1. python 字符串简介与常用函数
1. python中的字符串简介与常用函数 在python中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改 字符串是我们后面需要学习的稍大一点的 ...
- python测试开发django-6.模板中include使用
前言 当我们打开一个网站的时候,在打开不同的页面时候,会发现每个页面的顶部.底部内容都差不多,这样就可以把这些公共的部分,单独抽出来. 类似于python里面的函数,把公共部分写成函数,然后调用就行了 ...
- Maven实战(四)——基于Maven的持续集成实践
Martin的<持续集成> 相信非常多读者和我一样.最早接触到持续集成的概念是来自Martin的著名文章<持续集成>.该文最早公布于2000年9月,之后在2006年进行了一次修 ...
- 分布式消息系统Kafka初步(一) (赞)
终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开始分布式消息系统的入门. 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到 ...
- 环境变量篇getenv putenv setenv
getenv(取得环境变量内容) 相关函数 putenv,setenv,unsetenv 表头文件 #include<stdlib.h> 定义函数 char * getenv(const ...
- Informatica 常用组件Lookup之二 已连接和未连接的查找
可以配置一个已连接的查找转换,以从映射管道中直接接收输入:您也可以配置一个未连接的查找转换,以从其它转换的表达式结果中接收输入. 已连接的查找 未连接的查找 直接从管道接收输入值. 从其它转换的 :L ...
- Ubuntu下设置服务自启动
Ubuntu下设置服务自启动 一般/etc下可能还有/etc/rc.local,/etc/rc.sysinit文件,一般/etc/rc.local默认并不做什么实事,可能是系统留下的一个接口,供用户添 ...
- TCP的TIME_WAIT快速回收与重用
声明一点: Linux中是无法修改tcp的TIME_WAIT值的,除非重新编译,起码我是没有找到怎么改.值得注意的是,net.ipv4.tcp_fin_timeout这个参数是FIN_WAIT_2的值 ...