🌍 Redis GEO

掌握 Redis 地理位置功能的强大特性

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 ...]