ZooKeeper-ExpiryQueue详解

ZooKeeper服务端管理客户端会话超时使用到ExpiryQueue,该数据结构在管理超时连接时的使用还比较巧妙,在这里还是研究一下,以供以后参考使用。

一、类图

 
    图一
该队列的数据结构比较简单,包含两个Map,一个expirationInterval,一个nextExpirationTime,
一个私有方法,六个公共方法,一个构造函数。

二、数据模型

 
图二
ExpiryQueue根据expirationInterval将时间分段,将每段区间的时间放入对应的一个集合进行管理。如图二所示,时间段在1503556830000-1503556860000中的数据将会放到1503556860000对应的集合中,1503556860000-1503556890000中的数据将会放到1503556890000的集合中,以此类推。
在ExpiryQueue的数据结构中,图二中的集合由ConcurrentHashMap进行管理,其中的Key值为到期时间。
数据分段使用公式为:(当前时间(毫秒)/ expirationInterval + 1)* expirationInterval。该公式表示将当前时间按照expirationInterval间隔算份数,算完后再加一个份额,最后再乘以expirationInterval间隔,就得出了下一个到期时间。

三、源码分析

类名:org.apache.zookeeper.server.ExpiryQueue<E>

public class ExpiryQueue<E> {
    private final ConcurrentHashMap<E, Long> elemMap = new ConcurrentHashMap<E, Long>();
    /**
     * The maximum number of buckets is equal to max timeout/expirationInterval,
     * so the expirationInterval should not be too small compared to the
     * max timeout that this expiry queue needs to maintain.
     */
    private final ConcurrentHashMap<Lon
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值