XMemcached对操作主要的优化手段:
(1)get的优化
连续的get操作将被合并成一个get操作提交,最多合并mergeFactor个命令,这个参数可以通过
XMemcachedClient.setMergeFactor(int); default is 150
方法设置,默认是150,不推荐设置过大的数值。get优化默认是开启的,可以通过
XMemcachedClient.setOptimizeMergetGet(false); //default is true,recommend true
关闭。
(2)ByteBuffer合并
xmemcached会将连续的操作形成的ByteBuffer合并成一个大的ByteBuffer,大小接近socket的发送缓冲区大小,以最大限度地提升发送效率,这个优化默认也是开启的,可以通过
XMemcachedClient.setOptimizeMergeBuffer(false);//default is true,recommend true
关闭。不推荐关闭,除非你的应用缓存的数据特别大。
(3)网络层的优化
默认采用阻塞读,在局域网内能带来更好的效率,可以设置网络参数,linux系统在多节点memcached下,强烈建议将读线程数设置大于0,接近或者等于memcached节点数(具体参数看你的测试结果);在windows系统,推荐采用默认设置(也就是单线程):
MemcachedClientBuilder builder = new XMemcachedClientBuilder(
AddrUtil.getAddresses("localhost:12000"));
builder.setBufferAllocator(new CachedBufferAllocator());
//采用CachedBufferAllocator
builder.getConfiguration().setReadThreadCount(2); // 设置读线程数
MemcachedClient client=builder.build();
如上面代码所示,你可以采用CachedBufferAllocator作为ByteBuffer的分配器,这个分配器将在ThreadLocal中缓存创建的ByteBuffer重复利用,使用此分配器经测试没有带来显著的性能提升,慎用。
更多网络优化参数,可以通过
XMemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000"));
builder.getConfiguration().setHandleReadWriteConcurrently(true);
builder.getConfiguration().setReuseAddress(true);
builder.getConfiguration().setTcpNoDelay(true);
builder.getConfiguration().setTcpRecvBufferSize(8*1024);
MemcachedClient client=builder.build();
注:计划将xmemcached用于其和中。