今天产品提了一个需求,希望用户在微信小程序上可以根据用户当前的经纬度查询距离用户最近的5场赛事。这个需求一开始觉得很麻烦。因为要做大量计算,根据用户经纬度计算用户所在的地市,然后查看距离他最近的5场赛事都有什么,还要考虑到接口的查询时间不能太长。
在我们的系统里,赛事有很多,这样逐一比对查询距离最近的赛事方式肯定不现实。于是我突然想到之前在美团技术交流会上听的美团关于搜索用户附近商家的实现方案。我们的这个需求比美团简单的多,所以想是不是能简单的用那种方式实现呢。于是我就有了下面的实现方式。
首先,分析需求发现,我们的赛事都是只标注了地市的。那么我们可以将问题简单化,查询用户所在地市附近最近的地市,然后在查询地市中的赛事。
然后我们将地市的数据做一下切分,我以四川为例。下面的一个四川省地图:
然后我们一次性计算出所有地市周边的地市。数据格式如下:
[
{
"city": "成都",
"clist":
[
{
"city": "德阳"
},
{
"city": "眉山",
},
{
"city": "资阳"
}
]
},
{
"city": "德阳",
"clist":
[
{
"city": "成都"
},
{
"city": "绵阳",
},
{
"city": "遂宁"
}....
]
}
]
这个数据存入redis等地方,然后查询用户周边最近的赛事流程如下:
比如成都用户要查询数据:
第一步:查询成都的赛事
第二步:继续查成都下面最近的地市德阳的赛事
第三步:继续往下查眉山 -〉资阳
第四步:成都周边的地市查完了,继续向外拓展。查德阳周边的赛事
第五步:德阳最近的地市是成都,因为查过,所以直接跳过
第六步:查德阳第二近的地市,查绵阳。。。以此类推直到查询到你想要的数据为止
这样的好处是,数据一次性计算出来,然后查询的时候只要循环遍历地市周边的地市数据就好了,一层层向外查询。最终得到你要的数据。这样可以提高效率,计算也是java内部计算即可,速度会很快的。
后面的代码实现我们慢慢补上。