Memcached客户端-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, 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 不存在的情况下的初始值。两个参数的重载方法省略了第三个参数,默认指定为
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);

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-05 02:53:32

Memcached客户端-XMemcached使用的相关文章

使用memcached客户端Xmemcached与Spring整合

1 简介 Xmemcached是一个高性能的基于java nio的memcached客户端.在经过三个RC版本后,正式发布1.10-final版本. xmemcached特性一览: 1.高性能 2.支持完整的memcached文本协议,二进制协议将在1.2版本实现. 3.支持JMX,可以通过MBean调整性能参数.动态添加/移除server.查看统计等. 4.支持客户端统计 5.支持memcached节点的动态增减. 6.支持memcached分布:余数分布和一致性哈希分布. 7.更多的性能调整

Memcached客户端性能评测报告

转载:http://wenku.baidu.com/view/38a195c02cc58bd63186bdcb; 1.      Memcached客户端简介 本次memcached客户端评测以JAVA开源客户项目为评测对象,分别选择Memcached-Java-Client.spymemcached.xmemcached.alisoft xplatform asf cache四个项目,其中分别由两个产品基于堵塞式IO和NOI实现的客户端.两个国内开源项目或两个国外开源项目. 选择的客户端简介如

Spring学习(五)——集成memcached客户端

memcached是高性能的分布式内存缓存服务器.许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示. 但随着数据量的增大.访问的集中,就会出现RDBMS的负担加重.数据库响应恶化. 网站显示延迟等重大影响.memcached特别适合 用来解决上述问题,它可以缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度. 提高可扩展性.本例将在前一篇中 实现的Demo程序基础上集成memcached客户端. 1.单个服务端安装部署 官网http://memca

支持 .NET Core 的 Memcached 客户端 EnyimMemcachedCore

1. 介绍 EnyimMemcachedCore 是一个支持 .NET Core 的 Memcached 客户端,是从 EnyimMemcached 迁移至 .NET Core的,源代码托管在 GitHub 上:https://github.com/cnblogs/EnyimMemcachedCore ,NuGet 包地址:https://www.nuget.org/packages/EnyimMemcachedCore . 2. 使用说明 2.1 安装 NuGet 包 Install-Pack

分析Memcached客户端如何把缓存数据分布到多个服务器上

Memcached客户端可以设多个memcached服务器,它是如何把数据分发到各个服务器上,而使各个服务器负载平衡的呢? 可以看看.net版中的客户端中的源码,就可以知道 先看代码:   1 /// <summary>   2         /// Returns appropriate SockIO object given   3         /// string cache key and optional hashcode.   4         ///    5      

.NET平台上的Memcached客户端介绍

早上接到一个任务,需要对Linux服务器的Memcached的update操作进行性能测试,我发现我是一个典型的“手里拿着锤子,就把所有问题都当成钉子”的人.我第一个念头就是,上Memcached的官网找.NET的客户端.最后在Codeplex上找到了一个叫Memcached Providers的客户端程序,很小,218K,里面就3个DLL,一个是Memcached Providers本身的DLL,还有一个是Enyim.Caching,Enyim.Caching也是一个.NET平台上的Memca

memcached 客户端总结

        本文将从memcached 使用角度,从客户端,协议,服务器端来简要介绍一下memcached 的特性. memcached是一个高性能的分布式K-V内存存储系统,其在内存中维护了一张hash表,由于其可以在内存中读取,所以读写速度很快,由于内容存在内存中,断电后会遗失,所以可靠性不如db,现在也有将memcached和BDB结合在一起的,叫做memcacheDB,这里不做讨论. 由于其读写速度快的特性,在服务端的应用中,memcache 多应用于web机器和db层面之间的缓存.

[学习积累]memcached客户端和连接池

前阵子在网上找了个demo学了一下memcached的简单使用. 今天回顾了一下,我想:连接池不是应该算是服务端管理的东西么,Client应该是客户端管理的东西,怎么能放在同一个class里边呢?于是把demo改了改,代码如下: 服务端: package studyMemcached; import com.danga.MemCached.SockIOPool; public class MemServer {     private static SockIOPool pool;     pu

Windows下Memcached在.Net程序中的实际运用(从Memcached客户端Enyim的库的编译到实际项目运用) 转发

1.一点基础概念 2.获取EnyimMemcached客户端的源代码并编译出动态库 3.Memcached的服务器安装(windows server) 4.在web项目中实战 一.基础概念 memcached是什么?memcached是分布式缓存系统,特点是高性能.分布式内存缓存系统.memcached能做什么?用来给动态web提升响应速度(通过缓存数据,减少数据库访问压力).为什么要用memcached?笔者认为使用它的原因是能提升网站整体性能,减少数据库的的请求压力.据某位博主说合理使用Me