【应用场景】
在网络服务器中,需要维护所有连接信息,通常是以fd做为key,连接信息结构体做为value。每次有新连接接入时,需求加入一个映射关系;每次有新数据到达时,需要根据对应的fd查询到对应的连接信息结构。
通过上面的场景我们可以抽象出来一类数据,数据的特点如下:
【解决方案】
一种解决方案是,把信息保存在map或hash_map中,可以根据key方便的增、删、查对应的结构。不过,这两种存储方式都有一点的缺点,map查询的时间复杂度是o(logn),hash_map查询的时间复杂度是o(1),但是会分配一定的冗余空间。同时这两种方式都需要单独维护一个记录数上限。下面讨论一种基于下标查询的优化方案。
【方案优化】
就查询效率而言,数组下标索引的时间复杂度是最低的o(1),因此我们可以考虑把所有的记录都使用下标进行索引,但因为key是动态分配的,比如TCP连接的fd就是系统分配的,因此fd是不适合做下标的,所以我们可以把下标信息保存在key信息中。每次获得key信息后,从 key信息中解出下标,然后直接通过下标进行索引。 这种方案对应用场景又加了一条限制,就是“每次获取到的key信息有冗余字段可以保存下标”,因为这个方案是从epoll服务模型中抽象出来的,更多的应用场景有待发据掘。
【代码示例】
下面以基于epoll模型的服务器中连接管理为例介绍优化方案的实现。