Redis Geospatial 地理位置:附近的人、距离计算
2026/7/27 7:44:24 网站建设 项目流程

一、Geo 数据结构说明

Geo 底层基于 ZSet 有序集合,将经纬度通过 GeoHash 算法转为 52 位整数作为 ZSet 的 score,实现地理位置排序、范围查询。 适用:外卖商家、附近好友、打车点位、门店 LBS 搜索


二、核心命令全集

  1. GEOADD key 经度 纬度 标识 添加点位(经度在前,纬度在后)
# 添加门店:成都太古里 geoadd shop:chengdu 104.0730 30.6621 taikuli
  1. GEOPOS key 点位 查询点位经纬度
geopos shop:chengdu taikuli
  1. GEODIST key p1 p2 [单位] 计算两点距离,单位:m/km/mi/ft
# 计算两个门店距离,单位km geodist shop:chengdu taikuli jinjiangtiandi km
  1. GEORADIUS 中心点经纬度 半径 单位 按圆心范围查询附近点位(旧版)
  2. GEORADIUSBYMEMBER key 点位 半径 单位 以已有点位为中心查周边(常用:附近的人)
# 查询太古里3公里内所有门店 georadiusbymember shop:chengdu taikuli 3 km WITHDIST WITHCOORD ASC COUNT 10

参数说明:

  • WITHDIST:返回点位距离中心距离
  • WITHCOORD:返回经纬度
  • ASC/DESC:由近到远 / 由远到近
  • COUNT N:限制返回条数
  1. GEOHASH key 点位 获取点位 GeoHash 编码,可用于第三方地图索引

三、两大业务场景实战

场景 1:附近的人(社交 APP)

  1. 用户上线更新坐标:geoadd user:loc 经度 纬度 user_id
  2. 查询我周边 5km 在线用户:georadiusbymember user:loc my_uid 5 km ASC COUNT 20

场景 2:外卖附近商家

  1. 预录入全门店经纬度到 shop:city key
  2. 用户下单传入当前经纬度,GEORADIUS 查询 3km 内商家,按距离排序

四、优缺点

优点:内置 LBS 能力、基于 ZSet 性能高、距离 / 范围查询一条命令完成 缺点:

  1. GeoHash 精度固定,无法自定义;
  2. 不支持复杂多边形区域筛选;
  3. 海量点位大范围扫描性能下降,建议按城市分 key 隔离数据

五、Python LBS 示例

import redis r = redis.Redis(decode_responses=True) # 添加点位 r.geoadd("shop:cd", 104.0730, 30.6621, "taikuli") r.geoadd("shop:cd", 104.0650, 30.6580, "jinjiang") # 两点距离 print(r.geodist("shop:cd", "taikuli", "jinjiang", unit="km")) # 查询3km内门店 res = r.georadiusbymember("shop:cd", "taikuli", 3, unit="km", withdist=True, sort="ASC") print("附近门店:", res)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询