`
85977328
  • 浏览: 1872562 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

memcached(九)客户端高级-Java

 
阅读更多
简介
目前常用的Java客户端有3种。
  • MemcachedClient
  • spymemcached
  • xmemcached

,MemcachedClient:其中笔者亲测,在高并发的时候,容易报异常,Out Of Memory。
spy:的性能比xmemcached略差。
xmemcached:虽然是国产,但是首选,性能和稳定性超强。

xmemcached
代码解析
设置连接池和权重
        MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("10.11.155.26:11211 10.11.155.41:11211 10.10.76.31:11211 10.10.76.35:11211"), new int[] { 1, 1, 1, 1 });
        // 设置连接池大小,即客户端个数   
        builder.setConnectionPoolSize(50);


命名空间
memcachedClient.beginWithNamespace("sx"); //命名空间


设置一致性哈希算法和FailureMode
        try {
            MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddressMap("10.10.160.153:11211,10.10.160.153:11212"));

            builder.setSessionLocator(new KetamaMemcachedSessionLocator());
            builder.setFailureMode(true); // 在此模式下,某个节点挂掉的情况下,往这个节点的请求都将直接抛出MemcachedException的异常。 
            MemcachedClient client = builder.build();
        } catch (Exception e) {
            System.out.println("自定义异常");
            e.printStackTrace();
        }


添加状态监听器
memcachedClient.addStateListener(new MemcachedClientStateListener());//此处用的是一个匿名类


multi get优化
memcachedClient.setOptimizeGet(true);

xmemcached会将连续的单个get请求合并成一个multi get请求作批量获取,提高效率。默认是开启的

连接池设置
在高负载环境下,nio的单连接会遇到瓶颈,此时你可以通过设置连接池来让更多的连接分担memcached的请求负载,从而提高系统的吞吐量。设置连接池通过
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("localhost:12000"));
builder.setConnectionPoolSize(5);
MemcachedClient client=builder.build();

连接池通常不建议设置太大,我推荐在0-30之间为好,太大则浪费系统资源,太小无法达到分担负载的目的。

与spring3.2.5的集成
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.2.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
http://www.springframework.org/schema/aop  
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
	<!-- 配置文件 -->
	<bean id="configproperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="locations">
			<list>
				<value>classpath:application.properties</value>
			</list>
		</property>
	</bean>
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
		<property name="properties" ref="configproperties" />
	</bean>
	
	
	<!-- memcached初始化 -->
	<bean id="builder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
		<constructor-arg>
			<bean class="net.rubyeye.xmemcached.utils.AddrUtil" factory-method="getAddresses">
				<constructor-arg value="${memcached.host}" />
			</bean>
		</constructor-arg>
	</bean>
	<bean id="memcachedClient" class="net.rubyeye.xmemcached.MemcachedClient" factory-bean="builder" factory-method="build" destroy-method="shutdown" />
</beans>


性能优化
    性能的调整只能给出一般性的原则,实际情况千差万别,每次调整都需要做实际的测量才能确定是否带来期望的效果。

1、如果你的数据较小,如在1K以下,默认的配置选项已经足够。如果你的数据较大,我会推荐你调整网络层的TCP选项,如设置socket的接收和发送缓冲区更大,启用Nagle算法等等:   
MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(servers));
builder.setSocketOption(StandardSocketOption.SO_RCVBUF, 32 * 1024); // 设置接收缓存区为32K,默认16K
builder.setSocketOption(StandardSocketOption.SO_SNDBUF, 16 * 1024); // 设置发送缓冲区为16K,默认为8K
builder.setSocketOption(StandardSocketOption.TCP_NODELAY, false); // 启用nagle算法,提高吞吐量,默认关闭


默认如果连接超过5秒没有任何IO操作发生即认为空闲并发起心跳检测,你可以调长这个时间: 
builder.getConfiguration().setSessionIdleTimeout(10000);  // 设置为10秒;

更多网络层配置选项请参见Configuration类。

2、Xmemcached默认会做两个优化:将连续的单个get合并成一个multi get批量操作获取,将连续的请求合并成socket发送缓冲区大小的buffer发送。
如果你对响应时间比较在意,那么可以将合并的因子减小,或者关闭合并buffer的优化:
memcachedClient.setMergeFactor(50);   //默认是150,缩小到50
memcachedClient.setOptimizeMergeBuffer(false);  //关闭合并buffer的优化

如果你对吞吐量更在意,那么也可将合并因子调大,默认是150。但是也不可太大,太大可能导致平均响应时间延长。

3、如果你对心跳检测不在意,也可以关闭心跳检测,减小系统开销
memcachedClient.setEnableHeartBeat(false);
这个关闭,仅仅是关闭了心跳的功能,客户端仍然会去统计连接是否空闲,禁止统计可以通过:
builder.getConfiguration().setStatisticsServer(false);
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包10

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包1

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包4

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包101

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包11

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包6

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包9

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包8

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包5

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包3

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包2

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    java开源包7

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    Java资源包01

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

    网络架构师148讲视频课程

    │ 第63节:Memcached的Java客户端开发.avi │ 第64节:理解Memcached的分布式方式.avi │ 第65节:Memcached内存调优.avi │ 第66节:Memcached的限制和使用建议.avi │ 第67节:分析如何使用Memcached开发.avi │ ...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    由国内著名技术社区联合推荐的2012年IT技术力作:《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》,即将上架发行,此书从Web应用、数据备份与恢复、网络存储应用、运维监控与性能优化、集群高级应用等...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    可以加快开发效率,这是行业的发展趋势,但是局限于这样的“傻瓜化开发方式”的开发人员的竞争力和成长性都是非常有限的,遇到ASP.Net一些高级技术(比如ASP.Net MVC、SEO、网站调优、服务端客户端混合编程、AJAX等...

Global site tag (gtag.js) - Google Analytics