Redis应用实践——GeoHash

业界比较通用的距离排序算法,是GeoHash,Redis也使用了GeoHash算法。

可以用来实现附近的人,附近的单车,附近的司机等等功能。

实现原理

主要思路是将二维的坐标映射为一维的整数,比较基础容易理解的如二刀法。把正方形切一刀,然后再二分切一刀,再切 越来越小,然后每个切出来的正方形都用00,01,02这样的数字来表示,切的越多,数字越长,位置也更精确。

Geo算法会继续对这个整数做一次base32编码。在Redis中,将这个编码作为value放入zset中,score使用 经纬度编成的52位编码,可以用来排序距离。

基本用法

  • geoadd``geodist``getpos

  • gethash

  • georadiusbymember获取一定距离范围内的元素

  • georadius提供坐标查询一定距离范围内的元素

注意事项

数据量很大之后,Geo的占用空间将会很大,如果单个key的数据过大,在迁移时会产生较大的性能影响。所以建议Geo使用单独的Redis实例部署。如果数据量更大,需要对Geo进行拆分,如按省市区来拆分。