zookeeper之acl 张飞的绣花针

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

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

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

  主要成员变量

  

zookeeper之acl 张飞的绣花针_第1张图片

 

  其中

  longKeyMap 和 aclKeyMap 分别是acl集合信息和acl整形值之间建立的hashmap;

  referenceCounter: 是一个权限值引用计数器;

  aclIndex: acl权限编号;

  权限新建

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

  

zookeeper之acl 张飞的绣花针_第2张图片

 

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

  

zookeeper之acl 张飞的绣花针_第3张图片

 

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

  权限获取

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

  

zookeeper之acl 张飞的绣花针_第4张图片

 

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

  

zookeeper之acl 张飞的绣花针_第5张图片

 

  设计的好处

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

你可能感兴趣的:(个人技术分享)