Redis GEO 概述
Redis GEO 是 Redis 3.2 版本引入的地理位置功能,基于 Sorted Set 实现,可以存储地理位置信息并进行各种地理位置相关的操作,如距离计算、范围查询等。
📍 添加地理位置
使用 GEOADD 命令添加地理位置信息:
# 添加单个位置
GEOADD cities 116.397128 39.916527 "北京"
# 添加多个位置
GEOADD cities 121.473701 31.230416 "上海" \
113.264385 23.129163 "广州" \
114.085947 22.547 "深圳"
# 查看添加结果
ZRANGE cities 0 -1
坐标系统说明:
- 使用 WGS84 坐标系统
- 经度范围:-180 到 180 度
- 纬度范围:-85.05112878 到 85.05112878 度
- 格式:经度 纬度 成员名
📏 距离计算
计算两个地理位置之间的距离:
# 计算北京到上海的距离(默认米)
GEODIST cities "北京" "上海"
# 指定单位
GEODIST cities "北京" "上海" km
GEODIST cities "北京" "上海" mi
GEODIST cities "北京" "上海" ft
单位 | 说明 | 示例 |
---|---|---|
m | 米(默认) | 1067378.7564 |
km | 千米 | 1067.3788 |
mi | 英里 | 663.2115 |
ft | 英尺 | 3501243.7008 |
🎯 范围查询
查找指定范围内的地理位置:
# 以指定成员为中心查找范围内的位置
GEORADIUS cities 116.397128 39.916527 1000 km
# 以现有成员为中心查找
GEORADIUSBYMEMBER cities "北京" 1000 km
# 带距离信息
GEORADIUS cities 116.397128 39.916527 1000 km WITHDIST
# 带坐标信息
GEORADIUS cities 116.397128 39.916527 1000 km WITHCOORD
# 带哈希值
GEORADIUS cities 116.397128 39.916527 1000 km WITHHASH
# 限制返回数量并排序
GEORADIUS cities 116.397128 39.916527 1000 km COUNT 3 ASC
查询选项说明:
- WITHDIST:返回距离信息
- WITHCOORD:返回坐标信息
- WITHHASH:返回哈希值
- COUNT:限制返回数量
- ASC/DESC:按距离排序
🔍 获取位置信息
获取存储的地理位置信息:
# 获取位置坐标
GEOPOS cities "北京" "上海"
# 获取位置哈希值
GEOHASH cities "北京" "上海" "广州"
# 查看所有成员
ZRANGE cities 0 -1
# 查看成员数量
ZCARD cities
🗑️ 删除位置
删除地理位置信息:
# 删除单个位置
ZREM cities "深圳"
# 删除多个位置
ZREM cities "广州" "上海"
# 清空所有位置
DEL cities
注意: GEO 数据结构基于 Sorted Set,所以使用 ZREM 命令删除成员。
🏪 实际应用场景
Redis GEO 在实际项目中的应用:
常见应用场景:
- 附近的人:社交应用中查找附近用户
- 外卖配送:查找附近的餐厅和配送员
- 打车服务:匹配附近的司机和乘客
- 门店定位:查找附近的商店或服务点
- 物流追踪:跟踪货物和车辆位置
# 外卖应用示例
# 添加餐厅位置
GEOADD restaurants 116.397128 39.916527 "麦当劳-王府井店"
GEOADD restaurants 116.407128 39.926527 "肯德基-东单店"
GEOADD restaurants 116.387128 39.906527 "星巴克-前门店"
# 用户查找附近2公里内的餐厅
GEORADIUS restaurants 116.397128 39.916527 2 km WITHDIST ASC
# 添加配送员位置
GEOADD delivery_staff 116.397128 39.916527 "配送员001"
GEOADD delivery_staff 116.407128 39.926527 "配送员002"
# 为订单匹配最近的配送员
GEORADIUS delivery_staff 116.397128 39.916527 5 km COUNT 1 ASC
⚡ 性能优化
Redis GEO 性能优化建议:
优化策略:
- 合理设置查询半径,避免过大范围查询
- 使用 COUNT 限制返回结果数量
- 定期清理过期或无效的位置数据
- 考虑数据分片,避免单个 key 过大
- 使用适当的数据过期策略
# 性能优化示例
# 限制查询结果数量
GEORADIUS cities 116.397128 39.916527 100 km COUNT 10 ASC
# 按地区分片存储
GEOADD beijing_area 116.397128 39.916527 "地点1"
GEOADD shanghai_area 121.473701 31.230416 "地点2"
# 设置过期时间(适用于临时位置)
GEOADD temp_locations 116.397128 39.916527 "临时位置"
EXPIRE temp_locations 3600
🔧 GEO 命令总结
命令 | 功能 | 示例 |
---|---|---|
GEOADD | 添加地理位置 | GEOADD key lng lat member |
GEODIST | 计算距离 | GEODIST key member1 member2 [unit] |
GEORADIUS | 范围查询 | GEORADIUS key lng lat radius unit |
GEORADIUSBYMEMBER | 以成员为中心查询 | GEORADIUSBYMEMBER key member radius unit |
GEOPOS | 获取坐标 | GEOPOS key member [member ...] |
GEOHASH | 获取哈希值 | GEOHASH key member [member ...] |