如何快速写一个LBS服务器
发表于2015-09-17
如何快速写一个LBS服务器
现在的手游基本上都有一个附近的人的功能,说这个功能是约炮神器也好,反正CH说做就做,而且一定要做得快才好。互娱公共技术平台已经有一个基于网格的LBS组件,此文的主要目的在于开拓视野,也不妨碍有些项目的变态需求采用本文方案。
不知道有多少同事知道boost库里有一个spatial_index组件,知道的一定知道怎么用,下面就不用看了。
boost::geometry::spatial_index(以下简称spatial_index)是一个部分支持boost::interprocess库的rtree实现(部分支持的原因后面会讲)。利用该库可以快速搭建LBS服务器,实现的组件头文件+实现文件总共200行左右。
在本组件中,我们使用boost::interprocess::map配合spatial_index实现如下功能
1. insert 添加地理位置
2. erase 按OPEN_ID删除地理位置
3. query 查询附近的N个位置。
4. 清除过期位置
同事们还可以根据自己的需求添加接口,该组件的一个缺点是spatial_index实现内部使用了虚函数,服务器bin文件更新后,数据文件将不可用。
实测性能数据(VC2机器):
插入1M随机数据耗时:11.376S
查询1M次100个附近的人耗时:27.581S
1M数据内存消耗:200MB
本文中采用了linear平衡算法,插入快,查询慢。同事们也可以采用其他算法,算法的performance如下图所示:
具体实现如附件