一、附近的人问题
1. 用数据库求解
当然,现在数据库基本上都引入了相关功能,这里只介绍最普通的实现方式。
(1) 问题引入
如果要计算「附近的人」,也就是给定一个元素的坐标,然后计算这个坐标附近的其它元素,按照距离进行排序,该如何下手?如果现在元素的经纬度坐标使用关系数据库 (元素 id, 经度 x, 纬度 y) 存储,你该如何计算?
(2) 算法思想
首先,你不可能通过遍历来计算所有的元素和目标元素的距离然后再进行排序,这个计算量太大了,性能指标肯定无法满足。一般的方法都是通过矩形区域来限定元素的数量,然后对区域内的元素进行全量距离计算再排序。这样可以明显减少计算量。
(3) 划分区域
如何划分矩形区域呢?可以指定一个半径 r,使用一条 SQL 就可以圈出来。当用户对筛出来的结果不满意,
那就扩大半径继续筛选。
select id from positions where x0-r < x < x0+r and y0-r < y < y0+r
为了满足高性能的矩形区域算法,数据表需要在经纬度坐标加上双向复合索引 (x, y),这样可以最大优化查询性能。
(4) 缺点
但是数据库查询性能毕竟有限,如果「附近的人」查询请求非常多,在高并发场合,这可能并不是一个很好的方案。
2. 用Redis GeoHash算法求解
请看下面

本文探讨了在海量数据中高效查询附近人员的技术,包括使用数据库和Redis GeoHash算法的解决方案。通过介绍矩形区域筛选和GeoHash映射原理,展示了如何在保持高性能的同时,精确查找指定坐标周围的元素。
最低0.47元/天 解锁文章
1162

被折叠的 条评论
为什么被折叠?



