当需要在地图上计算 “附近的人” 的时候,业界通常使用 GeoHash 算法。
GeoHash 算法将二维的经纬度数据映射到一维的整数,这样地图上的点都将被映射到一条直线上,在地图上靠近的点映射到直线上的点之间的距离也会很接近,这样只需要在直线上获取附近的点就行了。
Redis 对 GeoHash 的支持
在 Redis 中,提供了 Geo 指令用以支持这种功能。
实际上,在 Redis 中,经纬度使用 52 位的整数进行编码,放进了 zset 里面,zset 的 value 是元素的 key,score 是 GeoHash 的 52 位整数值。zset 的 score 虽然是浮点数,但是对于 52 位的整数值,它可以无损存储。
在使用 Redis 进行 Geo 查询时,我们要时刻想到它的内部结构实际上只是一个 zset 。通过 zset 的 score 排序就可以得到坐标附近的其它元素 (实际情况要复杂一些,不过这样理解足够了),通过将 score 还原成坐标值就可以得到元素的原始坐标。
Geo 指令的基本使用
Redis 只提供了 6 个 Geo 指令。
- geo add key longitude latitude member [longitude latitude member …]
添加地理位置。
127.0.0.1:6379>