第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

深夜讀碼-zookeeper之a(chǎn)cl 張飛的繡花針

众所周知,内存资源总是有限的;

即便是java程序员,我们依然要考虑在使用低内存的情况下,高效地实现业务目标,构建优秀的软件,这是成为一个优秀的架构师的必经之路;

今天我们就和大家分享下,zookeeper 的acl的缓存存储,其主要的类是ReferenceCountedACLCache

主要成员变量

final Map<Long, List<ACL>> longKeyMap =
            new HashMap<Long, List<ACL>>();

final Map<List<ACL>, Long> aclKeyMap =
            new HashMap<List<ACL>, Long>();

final Map<Long, AtomicLongWithEquals> referenceCounter =
            new HashMap<Long, AtomicLongWithEquals>();

long aclIndex = 0;

其中
longKeyMapaclKeyMap 分别是acl集合信息和acl整形值之间建立的hashmap;
referenceCounter: 是一个权限值引用计数器;
aclIndex: acl权限编号;

权限新建

当我们创建节点的时候,可以看到datatree.java中createnode中有一行这样的代码

---------DataTree.java->createNode
Long longval = aclCache.convertAcls(acl);

---------ReferenceCountedACLCache.java

public synchronized Long convertAcls(List<ACL> acls) {
        if (acls == null)
            return OPEN_UNSAFE_ACL_ID;

        // get the value from the map
        Long ret = aclKeyMap.get(acls);
        if (ret == null) {
            ret = incrementIndex();
            longKeyMap.put(ret, acls);
            aclKeyMap.put(acls, ret);
        }

        addUsage(ret);

        return ret;
    }

该代码是将我们会话中的acl集合信息转换为long,也就是ReferenceCountedACLCache中的convertAcls,首先它会在aclKeyMap中查询是否有该acl集合信息,如果没有,就生成acl编号aclIndex,其实就是aclIndex+1;然后将这个值添加到longKeyMap 和aclKeyMap,这里的目的是为了建立一个aclIndex 和 acl的关系;最后再调用addUsage,而addUsage如下代码所示;

---------ReferenceCountedACLCache.java
    public synchronized void addUsage(Long acl) {
        if (acl == OPEN_UNSAFE_ACL_ID) {
            return;
        }

        if (!longKeyMap.containsKey(acl)) {
            LOG.info("Ignoring acl " + acl + " as it does not exist in the cache");
            return;
        }

        AtomicLong count = referenceCounter.get(acl);
        if (count == null) {
            referenceCounter.put(acl, new AtomicLongWithEquals(1));
        } else {
            count.incrementAndGet();
        }
    }

由addUsage的代码可以看出其主要就是存储该acl有多少个节点引用了;

权限获取

上面是创建,那么在我们查询权限的时候,就可以先获得某个节点,然后通过该节点的acl,就可以获取对应的acl集合信息;即下列代码

    public List<ACL> getACL(DataNode node) {
        synchronized (node) {
            return aclCache.convertLong(node.acl);
        }
    }
-----------------------------------------------------
    public synchronized List<ACL> convertLong(Long longVal) {
        if (longVal == null)
            return null;
        if (longVal == OPEN_UNSAFE_ACL_ID)
            return ZooDefs.Ids.OPEN_ACL_UNSAFE;
        List<ACL> acls = longKeyMap.get(longVal);
        if (acls == null) {
            LOG.error("ERROR: ACL not available for long " + longVal);
            throw new RuntimeException("Failed to fetch acls for " + longVal);
        }
        return acls;
    }

zookeeper这种设计的思想,如下图所示
图片描述

设计的好处

各节点上的信息,只保存了acl的整形值,这个整形值就是对acl缓存的引用值,而真正的acl集合信息在缓存ReferenceCountedACLCache,对于datatree整个树形结构来说节省了大量的内存;

好了,看到这里,不禁让人感慨,优秀的软件,不仅要能够像张飞一样耍大刀独当一面,还要有类似绣花针的杀手锏!希望大家有所收获,欢迎大家一块探讨zookeeper的问题,或者 zookeeper的源码分析

點(diǎn)擊查看更多內(nèi)容
2人點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消