目录
[3.9 Redis地理空间(GEO)](#3.9 Redis地理空间(GEO))
3.9 Redis地理空间(GEO)
简介
移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检査点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?
地球上的地理位置是使用二维的经纬度表示,经度范围(-180,180],纬度范围(-90,90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,然后当我们要找车时,在数据库中查找距离我们(坐标x0,yO)附近r公里范围内部的车辆
但是这样会有什么问题呢?
1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的
2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。
3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差
原理
Redis在3.2版本以后增加了地理位置的处理哦
命令
GEOADD 多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
GEODIST 返回两个给定位置之间的距离。
GEORADIUS 以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素
GEORADIUSBYMEMBER 跟GEORADIUS类似
GEOHASH返回一个或多个位置元素的 Geohash 表示
命令实操
如何获得某个地址的经纬度
- GEOADD
添加经纬度坐标
中文乱码如何处理
GEOADD city 116.403963 39.915119 "天安门 "116.40341439.924091 "故宫" 116.024067 40.362639 "长城"
type city #输出 zset
zrange city 0 -1 #输出 "中文乱码"
中文乱码解决方案
#在进入redis 客户端的时候 加 --raw参数
redis-cli -a passwd --raw
zrange city 0 -1 #输出 天安门 故宫 长城
- GEOPOS
返回经纬度
GE0POS city 天安门 故宫 长城 #输出 116.403963 39.915119 116.40341439.924091 116.024067 40.362639
- GEOHASH
返回坐标的geohash表示
原理:
geohash算法生成的base32编码值
3维变2维变1维
GEOHASH city 天安门 故宫 长城 #输出 wx4g0f6f2v0 wx4gogfqsjo wx4t85y1kto
- GEODIST
两个位置之间距离
GE0DIST city 天安门 故宫 m #输出 998.8332
- GEORADIUS
以半径为中心,查找附近的xxx
georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
-
GEORADIUSBYMEMBER
GE0RADIUSbymember city天安门
10 km withdist withcoord count 10 withhash