如何使用Redis和地理邻近搜索在同一位置查找两个用户?

Sim*_*ian 22 geospatial geo redis geohashing

我想实现一项服务,根据用户的地理坐标,可以检测两个用户是否实时位于同一位置.

为了实时和扩展,我似乎应该使用像Redis这样的分布式内存数据存储.我已经研究过使用geohashing,但问题是彼此接近的点可能并不总是共享相同的哈希前缀.因为我有兴趣找到两个用户是否足够接近他们彼此相邻的位置,所以geohashing可能有点过分.

当然,简单的解决方案就是测试地理坐标对是否落在彼此的小距离内.但AFAIK,Redis和其他内存数据采集器没有地理空间索引来支持这种查找.

实现这个的最佳方法是什么?

Arj*_*hta 17

此功能已融入Redis 3.2+.

但对于旧版本,问题仍然存在.我接受了Yin Qiwen的回答并为Node创建了一个模块,你可以通过检查代码来看看它是如何使用Redis的.他的指示是完美的,我能够跟随他们取得好成绩. https://github.com/arjunmehta/node-georedis

相同的算法本质上是用于本机命令的算法.

它非常快,并且避免任何类型的交叉/半字形操作.关于Yin Qiwen的方法最酷的事情(我认为)是算法中计算量最大的部分可以分发给客户端(而不是发生在DB或服务器上).

它并非100%精确,并且使用预先配置的距离步长,但对于大多数应用,您不需要我想象的精确度.

我还在GIS堆栈交换中解释了尹启文的文章.

对不起所有的链接.:P

  • 很抱歉,我本想提出这个答案,但现在不小心按下了 StackOverflow 不允许我提出来。 (2认同)

yin*_*wen 15

通常,这可以通过GeoHash和Redis的排序集来完成.在讨论如何在redis上实现空间索引服务之前,我写了一个设计.

https://github.com/yinqiwen/ardb/wiki/Spatial-Index


mza*_*zar 7

也许你可以尝试这个:

Redis地理版

你真的想尝试一下,它真的很棒.:)


jre*_*d42 5

我意识到这不能回答你的问题...但我认为这不是正确的工具.

PostgreSQL + PostGIS可以表现得非常好.您可以将PostgreSQL配置为运行尽可能多的数据库,因为它可以适合内存.

PostGIS使用(我认为)rtree索引,因此执行您感兴趣的查找速度非常快.

使用触发websocket请求的后端将允许您执行非常实时的操作.您的后端随时收到GPS坐标; 执行空间查找; 并通过websockets通知适用的客户.

  • Ubuntu 14.04很多依赖问题都很糟糕 (3认同)

nha*_*nha 5

此版本中其他答案中提到的Redis地理版本已从3.2版本集成到Redis中(也参见此前评论).

您可以在此处找到新命令(目前处于测试阶段):