业界比较通用的地理位置距离排序算法是 GeoHash 算法, Redis 也使用 GeoHash 算法。GeoHash算法将 二维的经纬度数据映射到一维的整数,这样所有的元素都将挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间的距离也会很接近。
Redis提供了6个Geo指令
- geoadd
127.0.0.1:6379> geoadd company 116.48105 39.996794 juejin
(integer) 1
127.0.0.1:6379> geoadd company 116.514203 39.905409 ireader
(integer) 1
127.0.0.1:6379> geoadd company 116.562108 39.787602 jd 116.334255 40.027400 xiaomi
(integer) 2
127.0.0.1:6379>
2. geodist
127.0.0.1:6379> geodist company jd xiaomi km
"33.0047"
127.0.0.1:6379> geodist company juejin ireader km
"10.5501"
127.0.0.1:6379>
3. 获取元素的 hash 值
geohash company jd
4. georadiusbymember
用来查询指定元素附近的其他元素
4.1 范围20公里以内最多 3个 元素 按距离 倒排,它不会排除自身
127.0.0.1:6379> georadiusbymember company jd 20 km
1) "jd"
2) "ireader"
127.0.0.1:6379> georadiusbymember company jd 20 km count 3
1) "jd"
2) "ireader"
127.0.0.1:6379> georadiusbymember company jd 20 km count 3 desc
1) "ireader"
2) "jd"
127.0.0.1:6379>
4.2 同时返回距离
georadiusbymember company jd 20 km count 3 desc withdist
5. 直接使用坐标
127.0.0.1:6379> georadius company 116.334255 40.027400 20 km count 3 desc withdist
1) 1) "juejin"
2) "12.9604"
2) 1) "xiaomi"
2) "0.0002"
127.0.0.1:6379>
6. 获取元素位置
geopos company jd