Redis 刚刚发布了 3.2 版本,其中官方支持了地理位置相关的 GEO API
非常适合简单的位置服务场景,例如
查找附近的商家、计算用户与商家的距离
使用示例
01
添加位置信息
> GEOADD locations -0.12455 51.5007 "Big Ben" -0.12520 51.50115 "Westminster Station" -0.11358 51.50482 "BFI IMAX"
(integer) 3
GEOADD 是添加位置信息的命令,locations 是 KEY,后面是多个位置信息
3项信息为一组(latitude, longitude, name),这里添加了3组
02
范围查找
例如用户的位置是 -0.11759 51.50574,想查找500米内的商家
> GEORADIUS locations -0.11759 51.50574 500 m
1) "BFI IMAX"
如果需要在找到商家的同时,还显示出相距的距离,并且距离近的排在前面,可以这样查找
> GEORADIUS locations -0.11759 51.50574 1 km WITHDIST ASC
1) 1) "BFI IMAX"
2) "0.2960"
2) 1) "Westminster Station"
2) "0.7335"
3) 1) "Big Ben"
2) "0.7392"
03
集合成员间的操作
查找某个成员的附近信息
> GEORADIUSBYMEMBER locations "Westminster Station" 100 m withdist
1) 1) "Westminster Station"
2) "0.0000"
2) 1) "Big Ben"
2) "67.3659"
计算两个成员间的距离
> GEODIST locations "Westminster Station" "BFI IMAX"
"902.1221"
04
列出成员
> ZRANGE locations 0 -1
1) "Big Ben"
2) "Westminster Station"
3) "BFI IMAX"
为什么使用了 ZRANGE 命令呢,因为GEO信息实际的存储结构就是一个有序集合 zset,GEOADD中每组位置信息中的name就是集合成员member,latitude和longitude会被计算出一个geohash值,做为权值
所以删除某个位置信息,也是用集合的删除命令
> ZREM locations "Big Ben"
(integer) 1
Redis 3.2 提供了非常简洁的位置命令,非常适合类似于“我附近有什么”的这种普通需求,但如果需要一套比较完整的 GIS 环境,PostgreSQL 和 PostGIS 会更加合适