微信之前有个功能,叫附近的人,可以搜索自己的微信用户。出门扫码买奶茶时,如果使用手机支付,可以很快速的定位到距离最近的一家店,然后方便的完成下单、支付。这些技术的背后,是使用经纬度坐标来定位位置,以某个点为圆心,搜索指定半径圆周内其他的位置点来实现的。
虽然可以大致明白背后的逻辑,但是要想自己实现相应的功能,还是有一定难度的,还好redis已经为我们提供了这种能力。
Redis的GEO数据类型
Redis3.2版本之后,增加了GEO数据类型,用于存储和查询地理位置。
对GEO的操作命令,主要为以下6个:
- geoadd:添加地理位置(支持多个)
geoadd key longitude latitude member [longitude latitude member ...]
- geopos:查询地理位置的坐标(支持多个)
geopos key member [member ...]
- geodist:计算两点之间的距离
geodist key member1 member2 [unit]
- georadius:查询某位置内其他成员信息
georadius key longitude latitude radius m|
- geohash:查询某个或多个位置的hash值
geohash key member [member ...]
- zrem:删除某个或多个位置
zrem key member [member ...]
操作实战示例:
// 添加多个位置
127.0.0.1:6379[9]> geoadd address 117.128531 31.828228 chuangxinyuan 117.129016 31.825252 shenggu 117.175853 31.908925 kexuedao 117.14373 31.839379 chanyeyuan
(integer) 4
// 查询创新院位置
127.0.0.1:6379[9]> geopos address chuangxinyuan
1) 1) "117.12852984666824341"
2) "31.82822871945806043"
// 计算创新院和科学岛的距离
127.0.0.1:6379[9]> geodist address chuangxinyuan kexuedao
"10027.0847"
// 计算创新院和科学岛的距离,以km为单位
127.0.0.1:6379[9]> geodist address chuangxinyuan kexuedao km
"10.0271"
// 查询以创新院为圆心,半径15公里内所有位置(117.128531 31.828228是创新院的经纬度)
127.0.0.1:6379[9]> georadius address 117.128531 31.828228 15 km
1) "shenggu"
2) "chuangxinyuan"
3) "chanyeyuan"
4) "kexuedao"
// 查询创新院为圆心,半径15公里内的所有位置,查出位置的经纬度坐标,距离圆心的公里数
127.0.0.1:6379[9]> georadius address 117.128531 31.828228 15 km WITHCOORD WITHDIST
1) 1) "shenggu"
2) "0.3341"
3) 1) "117.12901800870895386"
2) "31.82525295681698907"
2) 1) "chuangxinyuan"
2) "0.0001"
3) 1) "117.12852984666824341"
2) "31.82822871945806043"
3) 1) "chanyeyuan"
2) "1.8978"
3) 1) "117.14373260736465454"
2) "31.83937895783798666"
4) 1) "kexuedao"
2) "10.0271"
3) 1) "117.17585474252700806"
2) "31.90892410228676823"
// 查询创新院为圆心,半径15公里内的所有位置,查出位置的经纬度坐标,距离圆心的公里数,按距离排序取前两个
127.0.0.1:6379[9]> georadius address 117.128531 31.828228 15 km WITHCOORD WITHDIST COUNT 2 ASC
1) 1) "chuangxinyuan"
2) "0.0001"
3) 1) "117.12852984666824341"
2) "31.82822871945806043"
2) 1) "shenggu"
2) "0.3341"
3) 1) "117.12901800870895386"
2) "31.82525295681698907"
// 查询声谷的hash值
127.0.0.1:6379[9]> geohash address shenggu
1) "wtem13dexc0"
// 删除声谷的位置
127.0.0.1:6379[9]> zrem address shenggu
(integer) 1
应用场景
-可以查询附近的人,可以查询附件的店铺
-可以计算两点之间的直线距离(异地恋可以试一下)