博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcache client缓存节点分配机制和连接读取缓存机制
阅读量:6552 次
发布时间:2019-06-24

本文共 3600 字,大约阅读时间需要 12 分钟。

hot3.png

//mc client//hashingAlg 默认是0private final long getHash(String key, Integer hashCode) {    if (hashCode != null) {        if (hashingAlg == CONSISTENT_HASH)            return hashCode.longValue() & 0xffffffffL;        else            return hashCode.longValue();    } else {        switch (hashingAlg) {            case NATIVE_HASH:// 0                return (long) key.hashCode();            case OLD_COMPAT_HASH:                return origCompatHashingAlg(key);            case NEW_COMPAT_HASH:                return newCompatHashingAlg(key);            case CONSISTENT_HASH:                return md5HashingAlg(key);            default:                // use the native hash as a default                hashingAlg = NATIVE_HASH;                return (long) key.hashCode();        }    }}private boolean set(String cmdname, String key, Object value, Date expiry, Integer hashCode, Long casUnique,    boolean asString) {    //... ...    SchoonerSockIO sock = pool.getSock(key, hashCode);//获取服务节点    //... ...}public boolean set(String key, Object value) {    return set("set", key, value, null, null, 0L, primitiveAsString);}public boolean set(String key, Object value, Integer hashCode) {    return set("set", key, value, null, hashCode, 0L, primitiveAsString);}

从以上代码可以看出如果用set(key, value);方法设置缓存的话,根据key的hash值来分配存储节点的;

如果用set(key, value, hashcode);会优先按照指定的hash值分配节点,就是说只要hashcode值一样就存在同一个mc节点服务器。

说完的存储再来看看multiGet,跟set类似

public Map
 getMulti(String[] keys, Integer[] hashCodes, boolean asString) {    ......    SchoonerSockIO sock = pool.getSock(cleanKeys[i], hash);//同样是用getHash方法    ......}public Map
 getMulti(String[] keys) {    return getMulti(keys, null);}public Map
 getMulti(String[] keys, Integer[] hashCodes) {    return getMulti(keys, hashCodes, false);}

可以看出优先也是根据hashcode判断从哪个节点取数据。

看下面带hashCode例子

    @Test    public void testSetMcWithHash() {        for(int i = 1; i <= 20; i++) {            memCachedClient.set("test-hash-"+i, "test hash value " + i,             "EntityName".hashCode());        }    }        @Test    public void testGetMultiWithHash() {        String keyPrefix = "test-hash-";        String[] keys = new String[20];        Integer[] hashs = new Integer[20];        for(int i = 0; i < 20; i++) {           keys[i] = keyPrefix + (i+1);           hashs[i] = "EntityName".hashCode();        }        Object[] values = memCachedClient.getMultiArray(keys, hashs);        if(values != null) {            for(Object o : values) {                logger.debug("value: {}", o);            }        }    }

//mc命令 ,只要建立一次网络io连接

get test-1 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-9 test-10 test-11 test-12 test-13 test-14 test-15 test-16 test-17 test-18 test-19 test-20

1 -> loadMulti before: java.nio.HeapByteBuffer[pos=907 lim=8192 cap=8192]ret(20): {test-hash-5=test hash value 5, test-hash-4=test hash value 4, test-hash-7=test hash value 7, test-hash-6=test hash value 6, test-hash-9=test hash value 9, test-hash-8=test hash value 8, test-hash-10=test hash value 10, test-hash-20=test hash value 20, test-hash-14=test hash value 14, test-hash-13=test hash value 13, test-hash-12=test hash value 12, test-hash-11=test hash value 11, test-hash-18=test hash value 18, test-hash-17=test hash value 17, test-hash-16=test hash value 16, test-hash-15=test hash value 15, test-hash-1=test hash value 1, test-hash-2=test hash value 2, test-hash-19=test hash value 19, test-hash-3=test hash value 3}1 -> loadMulti after: java.nio.HeapByteBuffer[pos=0 lim=8192 cap=8192]

转载于:https://my.oschina.net/u/565351/blog/226596

你可能感兴趣的文章
联机分析处理
查看>>
使用 xampp-部署php网站
查看>>
一个脚本测试系统环境变量配置文件的启动顺序
查看>>
Java零碎知识
查看>>
lync客户端外网登陆提示exchange连接错误
查看>>
Hadoop 技术在电信运营商上网日志处理中的应用架构
查看>>
文件存储
查看>>
ubuntu安装tomcat7
查看>>
[python]列表的操作
查看>>
lsof入门
查看>>
linux温故知新九
查看>>
刘宇凡:史玉柱退休给年轻人的启示
查看>>
我的友情链接
查看>>
oracle数据库中由于没有做任何约束,如何删掉表中重复的记录
查看>>
挨踢项目求生法则(8)——计划篇
查看>>
C#关键字列表
查看>>
Javascript ES6中的箭头函数
查看>>
复制虚拟机出现网卡冲突的解决方案
查看>>
mysql 增查删改,备份恢复,授权等基础常用命令
查看>>
Python 多线程,文件io
查看>>