为什么要扩展呢?因为默认的配置并非集群环境的最佳实践。
为什么要简化呢?因为不简化的配置实在是太丑陋了。
分别贴出代码与spring3.x配置文件,备忘...
直接运用在项目中,可以通过配置文件的修改,轻松增加和减少cache节点,多方便,如果能热加就更完美了
我是个菜鸟,不知道咋写能热切。
XMemcachedClientBuilder这个类也真TM恶心,很多有用的参数都是private级别的,非逼人修改源码么这
不是?幸亏我们的JAVA拥有反射机制,否则被它恶心死了。
#########################################################
public class XMemcachedClientBuilderEX extends XMemcachedClientBuilder{
private Class clazz = XMemcachedClientBuilder.class;
private boolean weightFlag = true;
private int[] weights = null;
private List<InetSocketAddress> addressList = null;
/**
* 缓存节点
* 格式 IP:PORT:WEIGHT
* 如 192.168.137.2:11211:1
*/
public XMemcachedClientBuilderEX(List<String> cacheNode){
List<Integer> weight = new ArrayList();
StringBuffer sb = new StringBuffer();
for(String node:cacheNode){
String[] nodeArgs = node.split(":");
int len = nodeArgs.length;
switch (len) {
case 2://只有IP和端口的情况
sb.append(nodeArgs[0].trim()).append(":").append(nodeArgs[1].trim());
weightFlag = false;
break;
case 3:
sb.append(nodeArgs[0].trim()).append(":").append(nodeArgs[1].trim());
weight.add(Integer.parseInt(nodeArgs[2].trim()));
break;
default:
break;
}
sb.append(" ");
}
addressList = getAddresses(sb.toString());
weights = buildWeight(weight,weightFlag);
init(addressList,weightFlag,weights);
}
private void init(List<InetSocketAddress> addressList,boolean weightFlag,int[] w){
setCacheNode(addressList,weightFlag,w);
super.setCommandFactory(new net.rubyeye.xmemcached.command.TextCommandFactory());
super.setSessionLocator(new net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator());
super.setTranscoder(new net.rubyeye.xmemcached.transcoders.SerializingTranscoder());
}
private int[] buildWeight(List<Integer> weight,boolean weightFlag){
int[] w = null;
if(weightFlag){
Integer[] weightArr = (Integer[])weight.toArray();
w = new int[weightArr.length];
int i=0;
for(Integer wi:weightArr){
w[i++] = wi.intValue();
}
System.out.println("weight : "+w);
}
return w;
}
private void setCacheNode(List<InetSocketAddress> addressList,boolean weightFlag,int[] w){
Map<InetSocketAddress, InetSocketAddress> addressMap = buildAddressMap(addressList);
try {
Field[] fields = clazz.getDeclaredFields();
for(Field field:fields){
if(field.getName().equals("addressMap")){
field.setAccessible(true);
field.set(this, addressMap);
}
if(weightFlag && field.getName().equals("weights")){
field.setAccessible(true);
field.set(this, w);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Map<InetSocketAddress, InetSocketAddress> buildAddressMap(List<InetSocketAddress> addressList){
Map<InetSocketAddress, InetSocketAddress> addressMap = new LinkedHashMap<InetSocketAddress, InetSocketAddress>();
if (addressList != null) {
for (InetSocketAddress addr : addressList) {
addressMap.put(addr, null);
}
}
return addressMap;
}
private List<InetSocketAddress> getAddresses(String nodeInfo){
return AddrUtil.getAddresses(nodeInfo);
}
}
#########################################################
...
<bean name="memcachedClientBuilder" class="xxx.XMemcachedClientBuilderEX">
<constructor-arg>
<list>
<value>192.168.137.2:11211</value>
<value>192.168.137.2:11212</value>
<value>192.168.137.2:11213</value>
<value>192.168.137.2:11214</value>
<value>192.168.137.2:11215</value>
</list>
</constructor-arg>
</bean>
<bean name="memcachedClient"
factory-bean="memcachedClientBuilder"
factory-method="build"
destroy-method="shutdown" />
...
分享到:
相关推荐
Ehcache、xmemcached、redis 整合spring注解demo
spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> ${XMemcached_servers} <!-- ...
NULL 博文链接:https://xly1981.iteye.com/blog/1809837
xmemcached-1.2.4的官方源码。 xmemcached XMemcached is a high performance, easy to use blocking multithreaded memcached client in java. It's nio based (using my opensource nio framework :yanf4j), ...
repository\com\googlecode\xmemcached\xmemcached 2.4.6
memcache 分布式缓存,客户端,速度虽不比ehcache快。
xmemcached-1.2.6.2
xmemcached中文开发手册,提供的版本较老,但针对2.0的版本次文档同样适用,可以入门
xmemcached.chm帮助文档
官方中文手册,各种开发实例,集成spring等详尽配置信息,不错的资料!
xmemcached-1.4.3.jar
基于java nio实现的高性能可扩展的memcached客户端。虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此并不能够充分发挥Java NIO的性能优势.... xmemcached的项目主页...
测试类包括Xmemcached客户端与memcached client for java两者,可运行比较性能。 XMemcached简介: XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下...
NULL 博文链接:https://snowolf.iteye.com/blog/1612207
memcached 客户端 xmemcached jar 包,xmemcached 源文件 及 api
xmemcached 接口文档,方便开发和学习
xmemcached-1.4.2最新版,可用。memcached java客户端
xmemcached 2.4.5 和 xmemcached 2.3.2 两个版本号的