您现在的位置是:主页 > 数据库技术 > 数据库技术
Redis中的GEO地理位置模块怎么用
IDCBT2021-12-29【服务器技术】人已围观
简介这篇文章主要介绍了Redis中的GEO地理位置模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 GEO是
这篇文章主要介绍了Redis中的GEO地理位置模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
GEO是 Redis 在3.2版本之后新增的地理位置模块,意味可以用 Redis 来实现附近的地点功能。【相关推荐:Redis视频教程】
用数据库计算
一般的方法都是通过矩形区域来限定元素的数量,然后对区域内的元素进行全量距离计算再排序。这样可以明显减少计算量。
select id from positions where x0-r < x < x0+r and y0-r < y < y0+r
以上SQL为了增加性能,需要在经纬度坐标加上双向复合索引。 但是数据库查询性能毕竟有限,如果在高并发场合,这可能并不是一个很好的方案。
GEO算法业界比较通用的地理位置距离排序算法是 GeoHash
算法,Redis 也使用 GeoHash
算法。
GeoHash
算法将 二维的经纬度数据映射到一维的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。当我们想要计算「附近的人时」,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。
算法实现,它将整个地球看成一个 二维平面,然后划分成了一系列正方形的方格,就好比围棋棋盘。所有的地图元素坐标都将放置于唯一的方格中。方格越小,坐标越精确。然后对这些方格进行整数编码,越是靠近的方格编码越是接近。
编码之后,每个地图元素的坐标都将变成一个整数,通过这个整数可以还原出元素的坐标,整数越长,还原出来的坐标值的损失程度就越小。
GeoHash
算法会继续对这个整数做一次 base32
编码 (0-9,a-z 去掉 a,i,l,o 四个字母)
变成一个字符串。
在 Redis 里面,经纬度使用 52 位的整数进行编码,放进了 zset
里面,zset
的 value
是元素的 key
,score
是 GeoHash
的 52 位整数值。
在使用 Redis 进行 Geo 查询时,我们要时刻想到它的内部结构实际上只是一个 zset(skiplist)
。通过 zset
的 score
排序就可以得到坐标附近的其它元素 (实际情况要复杂一些,不过这样理解足够了),通过将 score
还原成坐标值就可以得到元素的原始坐标。
Redis GEO指令
1. 增加 geoadd
geoadd key longitude latitude member [longitude latitude member ...]
很赞哦! ()
标签:
业界比较通用的地理位置距离排序算法是 GeoHash
算法,Redis 也使用 GeoHash
算法。
GeoHash
算法将 二维的经纬度数据映射到一维的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。当我们想要计算「附近的人时」,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。
算法实现,它将整个地球看成一个 二维平面,然后划分成了一系列正方形的方格,就好比围棋棋盘。所有的地图元素坐标都将放置于唯一的方格中。方格越小,坐标越精确。然后对这些方格进行整数编码,越是靠近的方格编码越是接近。
编码之后,每个地图元素的坐标都将变成一个整数,通过这个整数可以还原出元素的坐标,整数越长,还原出来的坐标值的损失程度就越小。
GeoHash
算法会继续对这个整数做一次 base32
编码 (0-9,a-z 去掉 a,i,l,o 四个字母)
变成一个字符串。
在 Redis 里面,经纬度使用 52 位的整数进行编码,放进了 zset
里面,zset
的 value
是元素的 key
,score
是 GeoHash
的 52 位整数值。
在使用 Redis 进行 Geo 查询时,我们要时刻想到它的内部结构实际上只是一个 zset(skiplist)
。通过 zset
的 score
排序就可以得到坐标附近的其它元素 (实际情况要复杂一些,不过这样理解足够了),通过将 score
还原成坐标值就可以得到元素的原始坐标。
Redis GEO指令
1. 增加 geoadd
很赞哦! ()