黑马点评
GEO 就是 Geolocation 的简写形式,代表地理坐标。
Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。
常见的命令有:
GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
GEODIST:计算指定的两个点之间的距离并返回
GEOHASH:将指定 member 的坐标转为 hash 字符串形式并返回
GEOPOS:返回指定member的坐标
GEORADIUS:指定圆心、半径,找到该圆内包含的所有 member,并按照与圆心之间的距离排序后返回。6.2 以后已废弃
GEOSEARCH:在指定范围内搜索 member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2 新功能
GEOSEARCHSTORE:与 GEOSEARCH 功能一致,不过可以把结果存储到一个指定的 key。 6.2.新功能
测试
在redis中的样子
底层使用的也是zset的形式K-K-V
这里的经纬度都通过hash编码,降低内存消耗。
计算距离的命令
相对距离
就是简单的计算bjn-bjx(k-k)之间的距离,规定返回格式,同时要求的是存储在同一个k中的k(k-k-v)才可以计算
附近的人
基本命令:GEOSEARCH (k) (查询方式 经纬度) (圈地方式) (半径) (单位) (相对距离)
返回经纬度
语法: GEOPOS (k) (k)
GEOHASH (k) (k)
java操作redis的GEO
这个源码的阅读还是有些难度,核心思想就是:
如图,试用类型作为zset的k,他们自己的(id,经纬度) 作为(k-v)进行区分。
所以,综上所述,建议根据自己的业务进行调整,不管怎样,双层for循环的时间复杂度都太高。