ZooKeeper服务端管理客户端会话超时使用到ExpiryQueue,该数据结构在管理超时连接时的使用还比较巧妙,在这里还是研究一下,以供以后参考使用。
一个私有方法,六个公共方法,一个构造函数。
在ExpiryQueue的数据结构中,图二中的集合由ConcurrentHashMap进行管理,其中的Key值为到期时间。
数据分段使用公式为:(当前时间(毫秒)/ expirationInterval + 1)* expirationInterval。该公式表示将当前时间按照expirationInterval间隔算份数,算完后再加一个份额,最后再乘以expirationInterval间隔,就得出了下一个到期时间。
一、类图
图一
该队列的数据结构比较简单,包含两个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