将 redis 用于地理空间(稳定版)

Using redis for Geospatial(on stable version)

我正在尝试在 Redis 上建立一种让所有附近用户输入经度、纬度的方法。

这意味着我需要了解我应该如何将键、值插入到 Redis 以及我应该使用哪种数据结构

另一方面,我应该如何通过给定的经度、纬度输入在 Redis 中搜索附近的用户

我知道它在 Redis 3.2 上可用。但是我们仍然使用最后的redis redis (3.0.3)

谢谢, 射线.

所以对于这个输入:key:userId value

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 标识的 Geo-Set。

您现在可以使用 [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 公里半径内的所有元素,在本例中 return 结果为 Weinheim

您还可以通过集合成员查询 Geo-Set。意味着如果您使用集合中存在的位置,则可以将其用作参考,而不是使用 long/lat 指定地理位置(示例用例:搜索 userId X 半径内的所有用户):

[GEORADIUSBYMEMBER](http://redis.io/commands/georadiusbymember) key member radius m|km|ft|mi

例子

GEORADIUSBYMEMBER key "Train-Station" 5 KM

命令的结果return在Train-Station周围5公里半径范围内设置成员。结果元素是:Train-StationWeinheim.

lettuce is the first Java client that has native support for all Geo-Commands. You can find here 单元测试,它演示了 API 用法。

请注意,示例命令仅显示 Geo 功能的一个子集,请在 Redis 文档中阅读更多内容。