Redis 提供了 Geo(地理位置) 模块,其中 GeoHash 是一种用于存储和查询地理位置信息的数据结构。它能够高效地进行地理位置存储、查询、计算距离和查找附近地点等操作。
GeoHash 是一种将经纬度坐标转换为字符串编码的方式,它具有:
- 空间映射:将 2D 坐标(纬度 + 经度) 转换成 1D 字符串。
- 前缀匹配:相邻的地点会有相似的编码 (前缀相同,位置接近)。
- 高效存储:只需用短字符串表示一个地点,减少存储空间。
- 快速查询:可以基于 GeoHash 前缀进行快速附近查找。
Redis 的 Geo 采用 Sorted Set(有序集合) 来存储地理位置信息:
- Member(成员):地点名称(如
restaurant_1)。 - Score(分数):经纬度被编码为 52 位整数,作为排序依据。
GEOADD key longitude latitude member
GEOADD cities 116.40 39.90 "Beijing" GEOADD cities 121.47 31.23 "Shanghai" GEOADD cities 114.05 22.54 "Shenzhen"
📌 作用:将 Beijing、Shanghai 和 Shenzhen 的经纬度存入 cities 集合中。
GEOPOS key member [member ...]
GEOPOS cities "Beijing" "Shanghai"
📌 返回
[ [116.40, 39.90], [121.47, 31.23] ]
GEODIST key member1 member2 [unit]
- 单位(unit):
m(米)km(千米)mi(英里)ft(英尺)
GEODIST cities "Beijing" "Shanghai" km
📌 返回
1067.5711
表示 北京到上海直线距离 ≈ 1067.57 km。
⚠️ Redis 6.2 以后,
GEORADIUS被GEOSEARCH取代!
GEOSEARCH key FROMMEMBER member BYRADIUS radius unit
示例:查找北京 1000 km 内的城市
GEOSEARCH cities FROMMEMBER "Beijing" BYRADIUS 1000 km
📌 返回
1) "Beijing" 2) "Shanghai"
GEOSEARCHSTORE nearby_cities cities FROMMEMBER "Beijing" BYRADIUS 1000 km
📌 作用:将 Beijing 附近 1000 km 内的城市 存入 nearby_cities 集合。
GEOHASH key member [member ...]
GEOHASH cities "Beijing" "Shanghai"
📌 返回
1) "wx4g09z" 2) "wtw3sj5"
解析:
- “wx4g09z” 代表 北京 的 GeoHash 编码
- “wtw3sj5” 代表 上海 的 GeoHash 编码
💡 GeoHash 编码规则:
- 编码越长,精度越高
- 相邻位置的前缀相似
- 可以用前缀匹配进行快速区域查询
📌 示例
"wx4g09z"→ 代表 北京"wx4g"→ 代表北京的 大范围"wx4"→ 代表北京的 省级范围
✅ LBS(位置服务)
- 查找附近的商家、外卖、快递配送点
- 查找附近的用户(如社交软件)
✅ 共享出行
- 计算司机与乘客的距离
- 查找最近的车辆
✅ 物流配送
- 计算配送范围
- 规划最优配送路径
✅ 线下商店推荐
- 查找最近的门店
✅ Redis GeoHash 通过 Sorted Set 存储地理位置数据,支持快速查询和计算距离。
✅ 常用命令:
GEOADD(添加地点)GEOPOS(获取经纬度)GEODIST(计算两点距离)GEOSEARCH(查找附近地点)GEOHASH(获取 GeoHash 编码)
💡 适用于 LBS、物流、共享出行、门店推荐等场景,查询速度快,内存占用少!
原文链接:https://blog.csdn.net/qq_45638953/article/details/146371753?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522f79cd7047d89a2a7476788e1e3636f86%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=f79cd7047d89a2a7476788e1e3636f86&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-10-146371753-null-null.nonecase&utm_term=geo%E6%98%AF%E4%BB%80%E4%B9%88