spymemcached 是内存数据库memcached的的开源客户端软件,比较流行。 spymemcached 支持集群操作,但是 由于其内部机制的设计缺陷性,导致其 集群过程中 会出现一些预想之外的情况。
spymemcached 中locator.getSequence(key)最多会提供7个备选虚拟节点。根据作者的提示知道,当集群中的某一个节点宕机之后,spymemcached不会选择其他可用机器,而是选择直接失败,当当前节点宕机之后 spymemcached会有限的选择 另一个节点,但是根据作者的提示,当前节点失败后,会有 128 分之一的 几率会选择 宕机的节点。
我们需要修改源码。
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
作者的源码
public Iterator<MemcachedNode> getSequence(String k) {
// Seven searches gives us a 1 in 2^7 chance of hitting the
// same dead node all of the time.
return new KetamaIterator(k, 7, getKetamaNodes(), hashAlg);
}*
修改之后的代码
public Iterator<MemcachedNode> getSequence(String k) {
// return new KetamaIterator(k, 7, getKetamaNodes(), hashAlg);
int maxTry = config.getNodeRepetitions() + 1;
if (maxTry < 20) {
maxTry = 20;
}
return new KetamaIterator(k, maxTry, getKetamaNodes(), hashAlg);
}
其 get set delete 可能会存在由于 网络等原因造成的 操作失败。
可以适当修改其执行 方式来实现操作
@Override
public OperationFuture<Boolean> set(String key, int exp, Object o) {
OperationFuture<Boolean> result = null;
Object obj = null;
int count = 50;
while(obj == null && count >0 ){
result = asyncStore(StoreType.set, key, exp, o, transcoder);
obj = get(key);
count --;
}
return result;
}
@Override
public OperationFuture<Boolean> delete(String key) {
OperationFuture<Boolean> result = null;
Object obj = key;
int count = 50;
while(obj != null && count > 0){
result = delete(key, 0L);
obj = get(key);
count --;
}
return result;
}
相对于源码来说 加入了简单的重试机制。
可根据自身实际情况选择使用与否。
本文部分资料参考 http://www.udpwork.com/item/14792.html