您现在的位置是:主页 > 数据库技术 > 数据库技术

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 里面,zsetvalue 是元素的 keyscoreGeoHash 的 52 位整数值。

    在使用 Redis 进行 Geo 查询时,我们要时刻想到它的内部结构实际上只是一个 zset(skiplist)。通过 zsetscore 排序就可以得到坐标附近的其它元素 (实际情况要复杂一些,不过这样理解足够了),通过将 score 还原成坐标值就可以得到元素的原始坐标。

    Redis GEO指令

    1. 增加 geoadd

    geoadd key longitude latitude member [longitude latitude member ...]

    标签:

    很赞哦! ()

本栏推荐