0
点赞
收藏
分享

微信扫一扫

Redis7 10大数据类型(Redis地理空间)

一、简介

移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。

例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,
然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆

使用如下SQL即可:
select taxi from position where x0-r < x < x0 + r and y0-r < y < y0+r

但是这样会有什么问题呢?
1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的
2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。
3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差

Redis在3.2版本以后增加了地理位置的处理

二、原理

核心思想就是将球体转换为平面,区块转换为一点

Redis7 10大数据类型(Redis地理空间)_ci

三、命令

GEOADD 多个经度(longitude)、维度(latitude)、位置名称(member)添加到指定的key中
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
GEODIST 返回两个给定位置之间的距离
GEORADIUS 以给定的经纬度为中心,返回与中心的位置不超过给定最大位置的所有位置元素
GEORADIUSBYMEMBER 跟GEORADIUS类似
GEOHASH 返回一个或多个位置元素的GEOHASH表示

四、命令实操

如何获取某个地址的经纬度

http://api.map.baidu.com/lbsapi/getpoint

GEOADD添加经纬度坐标

Redis7 10大数据类型(Redis地理空间)_地理位置_02

中文乱码如何处理

Redis7 10大数据类型(Redis地理空间)_数据库_03

GEOPOS返回经纬度

Redis7 10大数据类型(Redis地理空间)_数据库_04

GEOHASH返回坐标的geohash表示

Redis7 10大数据类型(Redis地理空间)_数据库_05

geohash算法生成的base32编码值
3纬变2纬变1纬

Redis7 10大数据类型(Redis地理空间)_数据库_06

GEODIST两个位置之间距离

Redis7 10大数据类型(Redis地理空间)_数据库_07

后面参数是距离单位:
m 米
km 千米
ft 英尺
mi 英里

GEOREDIUS

georadius 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord withhash count 10 desc

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
COUNT 限定返回的记录数。

当前位置(116.418017 39.914402),阳哥在北京王府井

Redis7 10大数据类型(Redis地理空间)_地理位置_08

GEOREDIUSBYMEMBER

Redis7 10大数据类型(Redis地理空间)_地理位置_09

五、应用场景

地图附近酒店推送、美食推荐

举报

相关推荐

0 条评论