一、Geo 数据结构说明Geo 底层基于 ZSet 有序集合将经纬度通过 GeoHash 算法转为 52 位整数作为 ZSet 的 score实现地理位置排序、范围查询。 适用外卖商家、附近好友、打车点位、门店 LBS 搜索二、核心命令全集GEOADD key 经度 纬度 标识 添加点位经度在前纬度在后# 添加门店成都太古里 geoadd shop:chengdu 104.0730 30.6621 taikuliGEOPOS key 点位 查询点位经纬度geopos shop:chengdu taikuliGEODIST key p1 p2 [单位] 计算两点距离单位m/km/mi/ft# 计算两个门店距离单位km geodist shop:chengdu taikuli jinjiangtiandi kmGEORADIUS 中心点经纬度 半径 单位 按圆心范围查询附近点位旧版GEORADIUSBYMEMBER key 点位 半径 单位 以已有点位为中心查周边常用附近的人# 查询太古里3公里内所有门店 georadiusbymember shop:chengdu taikuli 3 km WITHDIST WITHCOORD ASC COUNT 10参数说明WITHDIST返回点位距离中心距离WITHCOORD返回经纬度ASC/DESC由近到远 / 由远到近COUNT N限制返回条数GEOHASH key 点位 获取点位 GeoHash 编码可用于第三方地图索引三、两大业务场景实战场景 1附近的人社交 APP用户上线更新坐标geoadd user:loc 经度 纬度 user_id查询我周边 5km 在线用户georadiusbymember user:loc my_uid 5 km ASC COUNT 20场景 2外卖附近商家预录入全门店经纬度到 shop:city key用户下单传入当前经纬度GEORADIUS 查询 3km 内商家按距离排序四、优缺点优点内置 LBS 能力、基于 ZSet 性能高、距离 / 范围查询一条命令完成 缺点GeoHash 精度固定无法自定义不支持复杂多边形区域筛选海量点位大范围扫描性能下降建议按城市分 key 隔离数据五、Python LBS 示例import redis r redis.Redis(decode_responsesTrue) # 添加点位 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, unitkm)) # 查询3km内门店 res r.georadiusbymember(shop:cd, taikuli, 3, unitkm, withdistTrue, sortASC) print(附近门店, res)