企业级Redis开发运维从入门到实践 (14)— GEO
GEO是什么
GEO(地理信息定位):存储经纬度,计算两地距离,范围计算等。
应用场景
- 类似微信中摇一摇,找出范围内的用户。
- 类似美团中酒店查询,找出范围内的酒店。
5个城市经纬度
城市 | 纬度 | 经度 | 简称 |
---|---|---|---|
北京 | 116.28 | 39.55 | beijing |
天津 | 117.12 | 39.08 | tianjin |
石家庄 | 114.29 | 38.02 | shijiazhuang |
唐山 | 118.01 | 39.38 | tangshan |
保定 | 115.29 | 38.51 | baoding |
GEO的相关命令
geoadd
- GEOADD key longitude latitude member [longitude latitude member …]:增加地理位置信息(纬度、经度、名字)。
- 有效的经度介于 -180 度至 180 度之间。
- 有效的纬度介于 -85.05112878 度至 85.05112878 度之间。
- 时间复杂度:每添加一个元素的复杂度为 O(log(N)) , 其中 N 为键里面包含的位置元素数量。
redis> geoadd cities:locations 116.26 39.55 beijing
(integer) 1
# 再添加一次依然可以添加成功
redis> geoadd cities:locations 116.26 39.55 beijing
(integer) 1
# 添加多个地理位置
redis> geoadd cities:locations 17.12 39.08 tianjin 14.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4
geopos
- geopos key member [member …]:获取地理位置信息。
- 时间复杂度:获取每个位置元素的复杂度为 O(log(N)) , 其中 N 为键里面包含的位置元素数量。
redis> geoadd cities:locations tianjin
1) 1)"17.12000042200088501"
2)"39.0800000535766543"
geodist
- geodist key member1 member2 [unit]:获取两个地理位置的距离。
- unit:m(米)、km(千米)、mi(英里)、ft(尺)。
- 复杂度:O(log(N))。
redis> geodist cities:locations tianjin beijing km
"89.2061"
georadius、georadiusbymember
- georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]:以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
- georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]:这个命令和 georadius命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是像 georadius那样, 使用输入的经度和纬度来决定中心点。
- withcoord:返回结果中包含经纬度。
- withdist:返回结果中包含距离中心节点位置。
- withhash:返回结果中包含geohash。
- COUNT count:指定返回结果数量。
- asc|desc:返回结果按照距离中心节点的距离做升序或者降序。
- store key:将返回结果的地理位置信息保存再指定键。
- storedist key:将返回结果距离中心节点的距离保存到指定键。
redis> georadiusbymember cities:locations beijing 150 km
1) "beijing"
2) "tianjin"
3) "tangshan"
4) "baoding"
相关说明
- since 3.2+,3.2及以上版本增加geo。
- type geoKey = zset,geo使用有序集合实现的。
- 没有删除API:zrem key member。