Memcache Hash算法揭秘

本文深入探讨了Memcache的Hash算法,包括一般Hash算法、基于权重的Hash算法和一致性Hash算法,阐述了它们在Memcache集群中的作用,以及如何通过权重分配确保数据的合理分布。同时,文章介绍了如何处理服务器动态增删对数据分布的影响,揭示了一致性Hash算法的优越性。
摘要由CSDN通过智能技术生成


    在大型互联网应用架构中,通常由多台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类初始化时会调用SchoonerSocketIOPoolPopulateBuckets方法,保存好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 时实际操作的是AscIIClientget/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)
    {
 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值