叁叁肆2018-12-18 10:44此文已由作者赵计刚授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
提示:有关于XMemcached在实际开发中的具体使用,查看"Java企业项目开发实践"系列博客的《第八章 企业项目开发--分布式缓存memcached》
注意:本文主要参考自https://code.google.com/p/xmemcached/wiki/User_Guide_zh
1、为什么选用Xmemcached客户端
当下常用的三种memcached Java客户端:
三者的实验比较结果:
http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html
所以,我们选用XMemcached来实现客户端的编写。
2、XMemcached的主要特性
3、使用
具体的实际使用查看文章头部的链接。
3.1、常用类介绍
说明:
/*
* 下面这样是配置主从
* 其中localhost:11211是主1,localhost:11212是他的从
* host2:11211是主2,host2:11212是他的从
*
* 注意:使用主从配置的前提是builder.setFailureMode(true)
*/
MemcachedClientBuilder builder =
new XMemcachedClientBuilder(AddrUtil.getAddressMap("localhost:11211,localhost:11212 host2:11211,host2:11212"));
builder.setFailureMode(true);//设置failure模式
其中,两种hash算法的实现与比较、两种序列化的实现与比较、池化的注意点查看《第六章 memcached剖析》
client.setSanitizeKeys(true);//URL做key
3.2、注意点
1 /**
2 * 该方法用于将传入的"host1:port1 host2:port2 ..."
3 * 这些众多的服务器转换为一个InetSocketAddress集合
4 */
5 public static List<InetSocketAddress> getAddresses(String s) {
6 if (s == null) {
7 throw new NullPointerException("Null host list");
8 }
9 if (s.trim().equals("")) {
10 throw new IllegalArgumentException("No hosts in list: ``" + s
11 + "''");
12 }
13 s = s.trim();
14 ArrayList<InetSocketAddress> addrs = new ArrayList<InetSocketAddress>();
15
16 for (String hoststuff : s.split(" ")) {//这里就是多服务器为什么要用空格隔开的理由
17 int finalColon = hoststuff.lastIndexOf(':');
18 if (finalColon < 1) {
19 throw new IllegalArgumentException("Invalid server ``"
20 + hoststuff + "'' in list: " + s);
21
22 }
23 String hostPart = hoststuff.substring(0, finalColon).trim();
24 String portNum = hoststuff.substring(finalColon + 1).trim();
25
26 addrs
27 .add(new InetSocketAddress(hostPart, Integer
28 .parseInt(portNum)));
29 }
30 assert !addrs.isEmpty() : "No addrs found";
31 return addrs;
32 }
/**
* Default operation timeout,if the operation is not returned in 5
* second,throw TimeoutException.
*/
public static final long DEFAULT_OP_TIMEOUT = 5000L;
public boolean touch(final String key, int exp)
速度极快。若希望获取缓存并更新缓存过期时间,该方法应该是只有二进制协议支持。
public <T> T getAndTouch(final String key, int newExp)
疑问:
standby主从模式,当主宕机后,set和get都会从从上边操作;那么,当主没有宕机,set操作是否会同时set到主和从呢?
免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐
更多网易技术、产品、运营经验分享请点击。