使用 redis 进行地理空间(稳定版)
Posted
技术标签:
【中文标题】使用 redis 进行地理空间(稳定版)【英文标题】:Using redis for Geospatial(on stable version) 【发布时间】:2015-08-26 09:35:35 【问题描述】:我正在尝试在 Redis 上建模,以获取所有附近用户的经度、纬度输入。
这意味着我需要了解我应该如何将键、值插入 redis 以及我应该使用哪种数据结构
另一方面,我应该如何通过给定的经度、纬度输入在 redis 中搜索附近的用户
我知道它在 Redis 3.2 上可用。但是我们还是用最后的redis redis (3.0.3)
谢谢你, 射线。
所以对于这个输入:key: userId value
【问题讨论】:
你的问题是基于意见的,但我会试一试。 【参考方案1】:Redis 地理数据在 Geo-Sets 中进行组织(由排序集支持)。将 userId 与地理数据相关联的方法非常适合 Redis Geo 支持。
出于分区原因,您可以为每个(域?/国家?)维护一个 Geo-Set。我找不到任何关于排序集大小限制的信息。 Redis 哈希可以contain up to 2^32 - 1
字段值对,我不确定这是否适用于排序集。因此,为简单起见,您现在拥有一组由 key
标识的集合,其中包含一些与地理位置相关联的成员:
你 [GEOADD](http://redis.io/commands/geoadd) some-set-name long1 lat1 userId1 long2 lat2 userId2 ... longN latN userIdN
然后集合包含一些条目。
示例
GEOADD key 8.6638775 49.5282537 "Weinheim" 8.3796281 48.9978127 "Office Tower" 8.665351, 49.553302 "Train-Station"
示例命令将三个位置添加到以key
标识的地理集。
您现在可以使用[GEORADIUS](http://redis.io/commands/georadius) some-set-name long lat radius m|km|ft|mi
查询集合并检索以long/lat中心为中心的半径内的所有成员。
示例
GEORADIUS key 8.6582861 49.5285695 1 KM
示例命令查询 1 公里半径内的所有元素,并在本例中返回 Weinheim
作为结果。
您也可以通过集合成员查询地理集合。意味着如果您使用集合中存在的位置,则可以将其用作参考,而不是使用 long/lat 指定地理位置(示例用例:搜索 userId X 半径内的所有用户):
[GEORADIUSBYMEMBER](http://redis.io/commands/georadiusbymember) key member radius m|km|ft|mi
示例
GEORADIUSBYMEMBER key "Train-Station" 5 KM
命令的结果返回Train-Station
周围5公里半径内的集合成员。生成的元素是:Train-Station
和 Weinheim
。
lettuce 是第一个原生支持所有地理命令的 Java 客户端。您可以找到 here 的单元测试,它演示了 API 的使用。
请注意,示例命令仅显示地理功能的一个子集,请在 Redis 文档中阅读更多信息。
【讨论】:
刚刚意识到您想在 3.0 而不是 3.2 中使用 Geo-Features,抱歉,错过了那部分:( 是的。感谢您的答复。但我使用的是稳定版 3.0。而且我们那里没有地理支持。我会尝试 3.2,但我害怕在生产中使用 beta 版本。你怎么看? 3.2 应该会在~9 月发布...您可以自己在排序集之上实现 Geo,就像 Matt 和 Salvatore 所做的那样。有一些开源可以在 Redis 之上进行此操作或其他地理建模......如果可能的话,我肯定会开始使用 3.2 的功能,而不是开发我自己的东西(顺便说一句,如果你使用不稳定并查找/报告/修复问题 - 它会尽快稳定;)) @mp911de 是否可以为此类条目设置时间段?例如,在 30 秒后,我希望删除地理列表中的条目 AFAIK - 没有。您只能使整个集合 (redis.io/commands/expire) 过期。没有 ZEXPIRE 这样的东西,但请随时提出问题github.com/antirez/redis以上是关于使用 redis 进行地理空间(稳定版)的主要内容,如果未能解决你的问题,请参考以下文章