对于经纬度坐标的存储以及在他们之间计算距离,使用关系型数据库将会变得很复杂,在 Redis 中可以使用其中内置的 GeoHash 算法实现,其实际上就是一个 ZSet ,value 为元素的 key ,score 为 52 位的整数(GeoHash 会将二维的数据映射成一维的数据再做一次 base32 编码)。
>> geoadd company 116.48105 39.996794 juejin
代表创建一个名为company的GeoHash结构,接着往里面添加一个元素,value为juejin,score为前面的经纬度坐标的映射值
>> geodist company juejin ireader km
可以计算出juejin 和 ireader 之间的距离km
>> geopos company juejin
可以获取juejin对应的经纬度(有小误差)
>> georadiusbymember company ireader 1 km withcoord withdist count 3 asc
可以查询ireader 1km范围内的3个公司 withcoord+withdist代表详细经纬度
因此使用该结构可以很简单地查询地图坐标之间的距离【实现附近的人、附近的餐馆等功能】。