序
在大型互联网应用架构中,通常由多台Memcache缓存服务器来构建Memcache集群,也叫做分布式Memcache。数据在写入缓存和从缓存中读取时,都会采用某中Hash算法,将数据Hash到某台具体的Memcache上,为了使应用在线的动态增加和移除Memcache服务器而不影响或很少影响其他已部署的Memcache服务器(也就是其他Memcache服务器中缓存的数据还能正常使用),这种Hash算法被称作为一致性Hash。
由一篇文章---Memcache分布式实现原理我们知道,Java_Memcahe支持一般Hash算法和实现应用中使用最广泛的一致性Hash算法,这两种算法都支持Server配置权重的虚拟节点Hash算法。下面我们由浅入深一一来探讨学习一下Java_Memcache的各种Hash 算法。
根据Memcache操作的步骤
SockIOPool sockpool= SockIOPool.getInstance();
//设置缓存服务器地址,可以设置多个实现分布式缓存
sockpool.setServers(new String[]{"127.0.0.1:11211","127.0.0.1:11212"});
//设置初始连接5
sockpool.setInitConn(5);
......
sockpool.initialize();//根据server以及一些配置信息初始化
memCache = new MemCachedClient();
//使用memcache操作数据memCache.get() & memCache.set()
一般Hash算法
初始化
在SockIOPool类初始化时会调用SchoonerSocketIOPool的PopulateBuckets方法,保存好Server信息,以便后续操作数据时使用。
private void populateBuckets()
{
buckets = new ArrayList();
for(int i = 0; i < servers.length; i++)
{
if(weights != null && weights.length > i)
{
for(int j = 0; j < weights[i].intValue(); j++)
buckets.add(servers[i]);
} else
{
buckets.add(servers[i]);//按Server的个数保存好Server地址及端口
}
Object obj;
if(authInfo != null)
obj = new AuthSchoonerSockIOFactory(servers[i], isTcp, bufferSize, socketTO, socketConnectTO, nagle, authInfo);
else
obj = new SchoonerSockIOFactory(servers[i], isTcp, bufferSize, socketTO, socketConnectTO, nagle);
GenericObjectPool genericobjectpool = new GenericObjectPool(((org.apache.commons.pool.PoolableObjectFactory) (obj)), maxConn, (byte)1, maxIdle, maxConn);
((SchoonerSockIOFactory) (obj)).setSockets(genericobjectpool);
socketPool.put(servers[i], genericobjectpool);//保存好Server与对应的对象工厂,该工厂管理与Server建立Socket的连接
}
}
在不考虑权重时,按Server的个数保存好Server信息,并保存与该server对应的对象工厂,用于管理与server建立Socket连接。
操作数据
在使用MemcacheClient进行get/set 时实际操作的是AscIIClient的get/set操作,由Memcache分布式原理我们知道,get方法最后执行的是get(String s, String s1, Integer integer, boolean flag)方法。
public class AscIIClient extends MemCachedClient
{
private Object get(String s, String s1, Integer integer, boolean flag)
{