一、CEO概述 - Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信 息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能,对于需 要实现这些功能的开发者来说是一大福音
- GEO功能是Redis的另一位作者Matt Stancliff借鉴NoSQL数据库Ardb实现的,Ardb的作者来自中国,它提供了优秀的GEO功能
二、增加地理位置信息(geoadd) geoadd key longitude latitude member [longitude latitude member ...]
- 参数如下:
- longitude:地址位置的经度
- latitude:地址位置的纬度
- member:成员
- 相关注意事项:
- geoadd一次可以添加多个地理位置信息
- geoadd添加成功返回1
- 如果member已经存在,那么该命令返回0,此时代表更新member的值
- 例如:下面添加5个城市的经纬度
三、获取地理信息位置(geopos) geodist key member1 member2 [unit]
- 该命令用来获取两个地址位置的距离
- unit参数代表返货结果的单位,包含以下4种:
- m(meters)代表米
- km(kilometers)代表公里
- mi(miles)代表英里
- ft(feet)代表尺
- 例如:下面计算天津到北京的距离,以公里为单位
四、获取指定位置范围内的地理信息位置集合(georadius、georadiusbymember) georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
- 两个命令作用相同,都是以一个地理位置为中心算出指定半径内的其他地理信息位置
- 不同的是:
- georadius命令的中心位置给出了具体的经纬度
- georadiusbymember只需给出成员即可
- 其中radiusm|km|ft|mi是必需参数,指定了半径(带单位),其他可选参数意义如下:
- withcoord:返回结果中包含经纬度
- withdist:返回结果中包含离中心节点位置的距离
- withhash:返回结果中包含geohash,有关geohash后面介绍
- COUNT count:指定返回结果的数量
- asc|desc:返回结果按照离中心节点的距离做升序或者降序
- store key:将返回结果的地理位置信息保存到指定键
- storedist key:将返回结果离中心节点的距离保存到指定键。
- 例如:下面计算5个城市中,距离北京150公里以内的城市
五、获取geohash geohash key member [member ...]
- Redis使用geohash(https://en.wikipedia.org/wiki/Geohash)将二维经纬度转换为一维字符串
- 例如:下面操作会返回beijing的geohash值
- geohash有如下特点:
- GEO的数据类型为zset(见下图),Redis将所有地理位置信息的geohash存放在zset中
- 字符串越长,表示的位置更精确,下图给出了字符串长度对应的精度,例如geohash长度为9时,精度在2米左右
- 两个字符串越相似,它们之间的距离越近,Redis利用字符串前缀匹配算法实现相关的命令
- geohash编码和经纬度是可以相互转换的
- Redis正是使用有序集合并结合geohash的特性实现了GEO的若干命令
六、删除地理位置信息(zrem) zrem key member
- GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以可以借用zrem命令实现对地理位置信息的删除
- 例如,下面将cities:locations中的所有地理位置信息删除