文档简介:
JAVA Spymemcache
JAVA代码示例
Memcache集群模式在客户端控制,一致性哈希算法可以有效防止单机或者多机掉线引发的大量数据迁移。
需要用户名密码
import lombok.extern.slf4j.Slf4j;
import net.spy.memcached.ConnectionFactoryBuilder;
import net.spy.memcached.DefaultHashAlgorithm;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.auth.AuthDescriptor;
import net.spy.memcached.auth.PlainCallbackHandler;
import net.spy.memcached.internal.OperationFuture;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
@Slf4j
public class CtyunMemTest {
public static void main(String[] args) {
String host1 = "****"; //1号机ip
int port1 = 11211;
InetSocketAddress inetSocketAddress1 = new InetSocketAddress(host1, port1); .
String hostn = "****"; //n号机ip
int portn = 11211;
InetSocketAddress inetSocketAddressn = new InetSocketAddress(hostn, portn);
ArrayList<InetSocketAddress> addressList = new ArrayList<>();
addressList.add(inetSocketAddress1); .
addressList.add(inetSocketAddressn);
ConnectionFactoryBuilder cBuilder = new ConnectionFactoryBuilder().setProtocol(ConnectionFactoryBuilder.Protocol.BINARY).setHashAlg(DefaultHashAlgorithm.KETAMA_HASH); //这里通过设置setHashAlg(DefaultHashAlgorithm.KETAMA_HASH),将集群模式选择为一致性hash。单机情况不用设置setHashAlg
//集群中不同主机的用户名和密码需要一致
String username = "****"; //用户名
String password = "****"; //密码
AuthDescriptor ad = new AuthDescriptor(new String[]{"PLAIN"},
new PlainCallbackHandler(username,password));
cBuilder.setAuthDescriptor(ad);
MemcachedClient memcachedClient = null;
try {
memcachedClient = new MemcachedClient(cBuilder.build(), addressList);
OperationFuture<Boolean> operationFuture = memcachedClient.set("ctyun", 60, "from ctyun");
Boolean result = operationFuture.get();
if(result){
log.info("set success");
log.info("get value is : {}", memcachedClient.get("ctyun"));
}else{
log.info("set fault");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
if(null != memcachedClient){
memcachedClient.shutdown();
}
}
}
}
不需要用户名密码
import lombok.extern.slf4j.Slf4j;
import net.spy.memcached.ConnectionFactoryBuilder;
import net.spy.memcached.DefaultHashAlgorithm;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.internal.OperationFuture;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
@Slf4j
public class CtyunMemTest {
public static void main(String[] args) {
String host1 = "****"; //1号机ip
int port1 = 11211;
InetSocketAddress inetSocketAddress1 = new InetSocketAddress(host1, port1); .
String hostn = "****"; //n号机ip
int portn = 11211;
InetSocketAddress inetSocketAddressn = new InetSocketAddress(hostn, portn);
ArrayList<InetSocketAddress> addressList = new ArrayList<>();
addressList.add(inetSocketAddress1); .
addressList.add(inetSocketAddressn);
ConnectionFactoryBuilder cBuilder = new ConnectionFactoryBuilder().setHashAlg(DefaultHashAlgorithm.KETAMA_HASH);
//这里通过设置setHashAlg(DefaultHashAlgorithm.KETAMA_HASH),将集群模式选择为一致性hash模式。单机情况不用设置setHashAlg
MemcachedClient memcachedClient = null;
try {
memcachedClient = new MemcachedClient(cBuilder.build(), addressList);
OperationFuture<Boolean> operationFuture = memcachedClient.set("ctyun", 60, "from ctyun");
Boolean result = operationFuture.get();
if(result){
log.info("set success");
log.info("get value is : {}", memcachedClient.get("ctyun"));
}else{
log.info("set fault");
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
if(null != memcachedClient){
memcachedClient.shutdown();
}
}
}
}
输出结果
set success
get value is : from ctyun