看到这个命令的输出量很大,所有信息都很有作用。举个例子吧,比如第一个slab中使用的chunks很少,第二个slab中使用的chunks很多,这时就可以考虑适当增大MemCache的增长因子了,让一部分数据落到第一个slab中去,适当平衡两个slab中的内存,避免空间浪费。
MemCache的Java实现实例
讲了这么多,作为一个Java程序员,怎么能不写写MemCache的客户端的实现呢?MemCache的客户端有很多第三方jar包提供了实现,其中比较好的当属XMemCached了,XMemCached具有效率高、IO非阻塞、资源耗费少、支持完整的协议、允许设置节点权重、允许动态增删节点、支持JMX、支持与Spring框架集成、使用连接池、可扩展性好等诸多优点,因而被广泛使用。这里利用XMemCache写一个简单的MemCache客户单实例,也没有验证过,纯属抛砖引玉:
public class MemCacheManager
{
private static MemCacheManager instance = new MemCacheManager();
/** XMemCache允许开发者通过设置节点权重来调节MemCache的负载,设置的权重越高,该MemCache节点存储的数据越多,负载越大 */
private static MemcachedClientBuilder mcb =
new XMemcachedClientBuilder(AddrUtil.getAddresses("127.0.0.1:11211 127.0.0.2:11211 127.0.0.3:11211"), new int[]{1, 3, 5});
private static MemcachedClient mc = null;
/** 初始化加载客户端MemCache信息 */
static
{
mcb.setCommandFactory(new BinaryCommandFactory()); // 使用二进制文件
mcb.setConnectionPoolSize(10); // 连接池个数,即客户端个数
try
{
mc = mcb.build();
}
catch (IOException e)
{
e.printStackTrace();
}
}
private MemCacheManager()
{
}
public MemCacheManager getInstance()
{
return instance;
}
/** 向MemCache服务器设置数据 */
public void set(String key, int expiry, Object obj) throws Exception
{
mc.set(key, expiry, obj);
}
/** 从MemCache服务器获取数据 */
public Object get(String key) throws Exception
{
return mc.get(key);
}
/**
* MemCache通过compare and set即cas协议实现原子更新,类似乐观锁,每次请求存储某个数据都要附带一个cas值,MemCache
* 比对这个cas值与当前存储数据的cas值是否相等,如果相等就覆盖老数据,如果不相等就认为更新失败,这在并发环境下特别有用
*/
public boolean update(String key, Integer i) throws Exception
{
GetsResponse<Integer> result = mc.gets(key);
long cas = result.getCas();
// 尝试更新key对应的value
if (!mc.cas(key, 0, i, cas))
{
return false;
}
return true;
}
}
CentOS 6.6下Memcached 源码安装配置
Ubuntu下安装Memcached及命令解释