您的位置:首页 > 数据库 > Memcache

memcached的java语言客户端和访问集群

2014-07-25 12:19 204 查看
关于memcached的各种语言的客户端介绍 http://code.google.com/p/memcached/wiki/Clients

memcached的java语言客户端有多种,应该选择哪一种比较好了?可以参考这边文章

memcached java客户端比较 /article/1404476.html

较早之前的一些比较主要是集中在java memcached client和spymemcached之间,普遍的结论是:spymemcached校之java memcached client有更高的性能,但却没有java memcached client稳定。随着java memcached client新版本的发布,一些新的对比测试标明java
memcached client在性能上并不比spymemcached逊色多少,再加上java memcached client被广泛使用,表现稳定,因此在一般情况下java memcached client是首选的memcache client.

除上述两个产品之外,还有一个由中国人编写的名为XMemcached的后起之秀,据该产品官网上给出的性能对比,这个产品的性能表现是非常优秀的。但在使用的普遍性和项目未来的可维护上,在选型上需要慎重考虑。

以下是相关产品官网发布的性能测试对比,结果似乎不是那么一致,甚至有些相左,只当参考吧,毕竟基于各自的立场和不同的对比环境,有出入是正常的。

java memcached client官方发布的性能对比:https://github.com/gwhalin/Memcached-Java-Client/wiki/PERFORMANCE

XMemcached官方发布的性能对比:http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html

综合考虑,java memcached client是一个稳妥的选择。

-----------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

所以对于Java客户端来说,首推Memcached Java Client(http://github.com/gwhalin/Memcached-Java-Client )(小技巧:在github项目主页网址后面加上downloads,就可以进入下载页面了,比如https://github.com/gwhalin/Memcached-Java-Client/downloads,在网页上没有找到这个入口真奇怪,从这里面可以下载二进制文件,而release下面是下载的源码,有些java项目,不知道怎样编译成jar包,这个时候就可以从downloads里面直接下载jar包了)(关于这个客户端的性能测试,可以参考:http://www.iteye.com/news/21812

调用memcached-java-client的api函数访问memcacheDB的小程序:

<span style="font-size:14px;"><span style="font-family:Microsoft YaHei;">import java.util.*;
import com.danga.MemCached.*;

public class JavaConnMem{
  public static void main(String[] args){
    MemCachedClient client = new MemCachedClient();
    String[] addr = {"127.0.0.1:21201"};
    Integer[] weights = {3};
    SockIOPool pool = SockIOPool.getInstance();
    pool.setServers(addr);
    pool.setWeights(weights);
    pool.setInitConn(5);
    pool.setMinConn(5);
    pool.setMaxConn(200);
    pool.setMaxIdle(1000*30*30);
    pool.setMaintSleep(30);
//    poolNagle(false);
//    pool.setSocketTo(30);    //可能使用的客户端版本有点老,使用这些注释掉的函数时会报错
//    pool.setSocketConnectTo(0);
    pool.initialize();

//    client.setCompressEnable(true);
//    client.setCompressThreshold(1000*1024);
    
    client.set("king","lbj");
    
    Date date = new Date(2000000);
    client.set("bag","kds",date);
   
    String str = (String)client.get("bag");
    System.out.println(str);
  }
} </span>
</span>
在linux下编译和执行此程序的时候,需要用到客户端的4个jar包,一时不知道怎么用-cp参数调用多个jar,索性就把这4个jar包复制到$J***A_HOME/lib下,然后设置CLASSPATH就可以直接编译运行了。

小程序参考文章:http://blog.csdn.net/seelye/article/details/8511073 http://www.cnblogs.com/ggjucheng/archive/2013/10/02/3349247.html

如果要使用Java客户端访问集群,怎只需要在

<span style="font-size:14px;"> String[] addr = {"127.0.0.1:21201"};</span>
<span style="font-size:14px;">中添加集群中节点的IP地址和端口号,set时,会自动计算key的hash值,存到不同的节点中。</span>


另外推荐一篇Memcached
Java Client API详解(http://blog.csdn.net/qqiabc521/article/details/6438429


Memcached Java Client API详解

针对Memcached官方网站

提供的java_memcached-release_2.0.1版本进行阅读分析,Memcached
Java客户端lib库主要提供的调用类是SockIOPool和MemCachedClient?,关键类及方法整理说明如下。


SockIOPool

这个类用来创建管理客户端和服务器通讯连接池,客户端主要的工作包括数据通讯、服务器定位、hash码生成等都是由这个类完成的。

public static SockIOPool getInstance()

获得连接池的单态方法。这个方法有一个重载方法getInstance( String poolName ),每个poolName只构造一个SockIOPool实例。缺省构造的poolName是default。
如果在客户端配置多个memcached服务,一定要显式声明poolName。

public void setServers( String[] servers )

设置连接池可用的cache服务器列表,server的构成形式是IP:PORT(如:127.0.0.1:11211)

public void setWeights( Integer[] weights )

设置连接池可用cache服务器的权重,和server数组的位置一一对应
其实现方法是通过根据每个权重在连接池的bucket中放置同样数目的server(如下代码所示),因此所有权重的最大公约数应该是1,不然会引起bucket资源的浪费。

for ( int i = 0; i < servers.length; i+/+ ) { if ( this.weights /!= null && this.weights.length > i ) { for ( int k = 0; k < this.weights[i].intValue(); k+/+ ) { this.buckets.add( servers[i] ); if ( log.isDebugEnabled() ) log.debug( "++++ added " + servers[i] + " to server bucket" ); } }


public void setInitConn( int initConn )

设置开始时每个cache服务器的可用连接数

public void setMinConn( int minConn )

设置每个服务器最少可用连接数

public void setMaxConn( int maxConn )

设置每个服务器最大可用连接数

public void setMaxIdle( long maxIdle )

设置可用连接池的最长等待时间

public void setMaintSleep( long maintSleep )

设置连接池维护线程的睡眠时间
设置为0,维护线程不启动
维护线程主要通过log输出socket的运行状况,监测连接数目及空闲等待时间等参数以控制连接创建和关闭。

public void setNagle( boolean nagle )

设置是否使用Nagle算法,因为我们的通讯数据量通常都比较大(相对TCP控制数据)而且要求响应及时,因此该值需要设置为false(默认是true)

ublic void setSocketTO( int socketTO )

设置socket的读取等待超时值

public void setSocketConnectTO( int socketConnectTO )

设置socket的连接等待超时值

public void setAliveCheck( boolean aliveCheck )

设置连接心跳监测开关。
设为true则每次通信都要进行连接是否有效的监测,造成通信次数倍增,加大网络负载,因此该参数应该在对HA要求比较高的场合设为TRUE,默认状态是false。

public void setFailback( boolean failback )

设置连接失败恢复开关
设置为TRUE,当宕机的服务器启动或中断的网络连接后,这个socket连接还可继续使用,否则将不再使用,默认状态是true,建议保持默认。

public void setFailover( boolean failover )

设置容错开关
设置为TRUE,当当前socket不可用时,程序会自动查找可用连接并返回,否则返回NULL,默认状态是true,建议保持默认。

public void setHashingAlg( int alg )

设置hash算法

alg=0 使用String.hashCode()获得hash code,该方法依赖JDK,可能和其他客户端不兼容,建议不使用
alg=1 使用original 兼容hash算法,兼容其他客户端
alg=2 使用CRC32兼容hash算法,兼容其他客户端,性能优于original算法
alg=3 使用MD5 hash算法

采用前三种hash算法的时候,查找cache服务器使用余数方法。采用最后一种hash算法查找cache服务时使用consistent方法。

public void initialize()

设置完pool参数后最后调用该方法,启动pool。


MemCachedClient?

public void setCompressEnable( boolean compressEnable )

设定是否压缩放入cache中的数据
默认值是ture
如果设定该值为true,需要设定CompressThreshold?

public void setCompressThreshold( long compressThreshold )

设定需要压缩的cache数据的阈值
默认值是30k

public void setPrimitiveAsString( boolean primitiveAsString )

设置cache数据的原始类型是String
默认值是false
只有在确定cache的数据类型是string的情况下才设为true,这样可以加快处理速度。

public void setDefaultEncoding( String defaultEncoding )

当primitiveAsString为true时使用的编码转化格式
默认值是utf-8
如果确认主要写入数据是中文等非ASCII编码字符,建议采用GBK等更短的编码格式

cache数据写入操作方法

set方法

将数据保存到cache服务器,如果保存成功则返回true
如果cache服务器存在同样的key,则替换之
set有5个重载方法,key和value是必须的参数,还有过期时间,hash码,value是否字符串三个可选参数

add方法

将数据添加到cache服务器,如果保存成功则返回true
如果cache服务器存在同样key,则返回false
add有4个重载方法,key和value是必须的参数,还有过期时间,hash码两个可选参数

replace方法

将数据替换cache服务器中相同的key,如果保存成功则返回true
如果cache服务器不存在同样key,则返回false
replace有4个重载方法,key和value是必须的参数,还有过期时间,hash码两个可选参数

建议分析key的规律,如果呈现某种规律有序,则自己构造hash码,提高存储效率

cache数据读取操作方法

使用get方法从cache服务器获取一个数据

如果写入时是压缩的或序列化的,则get的返回会自动解压缩及反序列化
get方法有3个重载方法,key是必须的参数,hash码和value是否字符串是可选参数

使用getMulti方法从cache服务器获取一组数据

get方法的数组实现,输入参数keys是一个key数组
返回是一个map

通过cache使用计数器

使用storeCounter方法初始化一个计数器
使用incr方法对计数器增量操作
使用decr对计数器减量操作


Memcached Client
API 优化(草)


实现memcached的遍历操作

有些应用情况下,需要遍历memcached服务器中所有被cache的数据,目前memcached client API不支持遍历操作,需要进行扩展。


实现get时刷新数据过期时间(应用于session,可能需要修改服务器端程序)

当memcached被用作session服务器的时候,需要支持session的access方法,根据最近访问时间刷新过期时间,目前memcached也不支持该操作,需要进行扩展。



关于memcache更加详细的讲解,可以参考:http://nhy520.iteye.com/blog/1775893/(

J***A MemCache 史无前例的详细讲解【转】


关于memcache其他各种客户端的介绍和比较可以参考:http://wang-heaven.iteye.com/blog/1674911
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: