Redis 在 3.2 版本就新增了 GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。

GEO 功能是 Redis 的另一位作者 Matt Stancliff 借鉴 NoSQL 数据库 Ardb 实现的。

基础 API

  • 增加地理位置信息:geoadd key longitude latitude member [longitude latitude member ...]
    • longitudelatitudemember 分别是该地理位置的经度、纬度、成员
    • 示例:geoadd cities:locations 116.28 39.55 beijing
  • 获取地理位置信息:geopos key member [member ...]
  • 获取两个地理位置的距离:geodist key member1 member2 [unit]
    • 单位:m(meters)、km(kilometers)、mi(miles)英里、ft(feet)尺
  • 获取指定位置范围内的地理信息位置集合
1
2
georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
  • georadiusgeoradiusbymember 两个命令的作用是一样的
  • georadius 命令的中心位置给出了具体的经纬度,georadiusbymember 只需给出成员
  • 可选项:
    • withcoord:返回结果中包含经纬度
    • withdist:返回结果中包含离中心节点位置的距离
    • withhash:返回结果中包含 geohash
    • COUNT count:指定返回结果的数量
    • asc|desc:返回结果按照离中心节点的距离做升序或者降序
    • store key:将返回结果的地理位置信息保存到指定键
    • storedist key:将返回结果离中心节点的距离保存到指定键
  • 示例:距离北京 150 公里以内的城市 georadiusbymember cities:locations beijing 150 km
  • 删除地理位置信息:zrem key member
    • GEO 没有提供删除成员的命令
    • GEO 的底层实现是 zset,所以可以借用 zrem 命令实现对地理位置信息的删除

参考资料

  1. 付磊, 张益军著.Redis 开发与运维.机械工业出版社.2017