想用代码丈量地球?Redis GEO数据类型让你用一行命令就能构建滴滴打车般的实时定位系统!这个藏在Redis中的空间魔法,自3.2版本起就为开发者打开了新世界的大门。
01 空间魔法的核心咒语
Redis GEO本质上是基于Sorted Set的魔法变形,它将经纬度编码为52位Geohash字符串,化身ZSET的score值。
GEO 数据类型是从Redis3.2.0开始有的。
1.1 咒语:GEOADD
# 增加经维度信息
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
- key: Redis的Key,管理经纬度的标识
- NX:不存时写入
- XX:存在时写入
- CH:改变计数器的开关,全称changed
- longitude:经度
- latitude:维度
- member:可以理解为这组经纬度(成员)的一个名称
可以一次性增加多个经纬度。
数据准备:
上海市:121.480248,31.236276
苏州市:120.591682,31.305976
杭州市:120.216329,30.252589
> geoadd cities 121.480248 31.236276 shanghai 120.591682 31.305976 suzhou 120.216329 30.252589 hangzhou
(integer) 3
CH 的使用:坐标变化检测的计数器
我们修改上海的坐标:121.49 31.24 shanghai
> geoadd cities 121.49 31.24 shanghai
(integer) 0
> geopos cities shanghai
1) 1) "121.49000018835067749"
2) "31.24000104945258727"
我们看到shanghai的坐标已经改变,但是返回值是0。我们再改回去,加上CH
> geoadd cities CH 121.480248 31.236276 shanghai
(integer) 1
> geopos cities shanghai
1) 1) "121.48024767637252808"
2) "31.2362750093483541
我们可以看到已经改回去了。加上CH 返回值会变,返回当前命令修改坐标且变化的次数。
1.2 咒语:GEOPOS
# 查看成员的经纬度,
GEOPOS key [member [member ...]]
这个很简单,可以一次性查一个或者多个。上一节已经有所展示。
> geopos cities shanghai
1) 1) "121.48024767637252808"
2) "31.2362750093483541
1.3 咒语:GEOHSAH
# 查看成员的坐标hash值
GEOHASH key [member [member ...]]
> geohash cities shanghai
1) "wtw3sq7hqz0"
1.4 咒语:GEODIST
# 查看两个成员之间的实际距离(直线距离)
GEODIST key member1 member2 [M | KM | FT | MI]
其中 [M | KM | FT | MI] 表示距离的单位:
- M:米(默认)
- KM:千米
- FT:英尺(foot)
- MI:英里(mile) 【皮一下,有没有把它认成是米的,哈哈。。。】
> geodist cities shanghai suzhou KM
"84.8286"
1.5 咒语:GEORADIUS
# 根据当前经纬度获取方圆范围内的成员
GEORADIUS key longitude latitude radius M | KM | FT | MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key]
例如查看昆山市(120.987239,31.391653 )方圆100公里以内的成员
> georadius cities 120.987239 31.391653 100 KM
1) "shanghai"
2) "suzhou"
> georadius cities 120.987239 31.391653 100 KM withcoord withdist
1) 1) "shanghai"
2) "49.9337"
3) 1) "121.48024767637252808"
2) "31.2362750093483541"
2) 1) "suzhou"
2) "38.7634"
3) 1) "120.59168010950088501"
2) "31.30597477178785937"
默认罗列成员,其他的需要响应的参数。
- WITHCOORD 获取经纬度
- WITHDIST 获取距离
- WITHHASH 获取成员Hash
- COUNT 限制罗列的成员数量
- ASE | DESC 排序
- STORE key 将返回的地理位置信息保存到一个key里面
- STOREDIST key 将返回的目标距离保存到一个key里面
1.6 咒语 :GEORADIUSBYMEMBER
类似GEORADIUS ,只不过将经纬度变成了成员名称。
GEORADIUSBYMEMBER key member radius M | KM | FT | MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key]
1.7 咒语 :GEORADIUSBYMEMBER_RO
类似GEORADIUSBYMEMBER ,只不过没有了一部分信息[STORE key | STOREDIST key]
GEORADIUSBYMEMBER_RO key member radius M | KM | FT | MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
1.8 咒语 :GEORADIUS_RO
类似GEORADIUSBYMEMBER_RO 命令,只不过将成员换成经纬度了。
GEORADIUS_RO key longitude latitude radius M | KM | FT | MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC]
1.9 咒语 :GEOSEARCH
上面的方法从Redis 3.2.0开始,但是本咒语来自6.2.0 。可以替换GEORADIUS 相关的命令
# 从成员|经纬度 获取方圆范围内的信息
GEOSEARCH key FROMMEMBER member | FROMLONLAT longitude latitude BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI [ASC | DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] ...
> geosearch cities frommember suzhou byradius 100 KM withcoord withdist
1) 1) "suzhou"
2) "0.0000"
3) 1) "120.59168010950088501"
2) "31.30597477178785937"
2) 1) "shanghai"
2) "84.8286"
3) 1) "121.48024767637252808"
2) "31.2362750093483541"
1.10 咒语:GEOSEARCHSTORE
命令类似GEOSEARCH ,只不过是要将结果保存到一个新的key中。
GEOSEARCHSTORE destinationkey key FROMMEMBER member | FROMLONLAT longitude latitude BYRADIUS radius M | KM | FT | MI | BYBOX width height M | KM | FT | MI [ASC | DESC] [COUNT count [ANY]] ...
- destinationkey:目标key
以上是所有GEO相关的魔法咒语。
02 真实世界的空间战场
-
即时配送革命
美团外卖通过GEOADD实时更新骑手位置,GEORADIUSBYMEMBER自动匹配3公里内最近骑手,订单分配响应时间<50ms
-
社交引力场
探使用GEOSEARCH STORE缓存用户100米内的潜在匹配,每日处理20亿次位置查询仍保持亚毫秒响应
-
智能交通网
滴滴出行集群部署Redis GEO,每秒处理10万+车辆位置更新,半径搜索性能比MongoDB快30倍
-
物联空间感知
菜鸟物流在GEOfence中设置电子围栏,车辆进出仓库时自动触发WATCH命令通知调度系统
03 选型决策指南
✅ 推荐场景
- 需要实时位置更新的移动端应用
- 千万级地理位置数据存储
- 响应时间要求<100ms的LBS服务
- 动态地理围栏监控
❌ 慎用情况
- 需要复杂GIS运算(如多边形区域判断)
- 超高精度测绘场景(误差需<1米)
- 已有成熟空间数据库(PostGIS/MongoDB)
04 结语
空间数据洪流时代,Redis GEO就像程序世界的空间折叠器。当其他数据库还在解析复杂GIS函数时,Redis已用一行命令为你打开虫洞——这才是真正为高并发而生的位置智能!
END
喜欢就点赞、收藏,微信可以搜公众号【编程朝花夕拾】或扫码关注我哦!