数据结构之GEO
GEOADD:存储坐标
通过使用GEOADD命令,用户可以将给定的一个或多个经纬度坐标存储到位置集合中,并为这些坐标设置相应的名字:
GEOADD location_set longitude latitude name [longitude latitude name ...]
在使用GEOADD命令向位置集合添加坐标的时候,如果用户给定的位置在集合中已经有了与之相关联的坐标,那么GEOADD命令将使用用户给定的新坐标去代替已有的旧坐标。(添加返回1,更新返回0)
GEOPOS:获取指定位置的坐标
GEOPOS location_set name [name ...]
GEODIST:计算两个位置之间的直线距离
在默认情况下,GEODIST命令将以米为单位,返回两个给定位置之间的直线距离。
用户也可以在有需要的情况下,通过可选的unit参数来指定自己想要使用的单位:
GEODIST location_set name1 name2 [unit]
unit参数的值可以是以下单位中的任意一个:
·m——米
·km——千米
·mi——英里
·ft——英尺
GEORADIUS:查找指定坐标半径范围内的其他位置
GEORADIUS location_set longitude latitude radius unit
·location_set参数用于指定执行查找操作的位置集合。
·longitude参数和latitude参数分别用于指定中心点的经度和纬度。
·radius参数用于指定查找半径。
·unit参数用于指定查找半径的单位。
GEORADIUS命令具有可选的WITHDIST选项,如果用户在执行GEORADIUS命令时给定了这个选项,那么GEORADIUS命令不仅会返回位于指定半径范围内的位置,还会返回这些位置与中心点之间的距离。
除了WITHDIST之外,GEORADIUS命令还提供了另一个可选项WITHCOORD,通过使用这个选项,用户可以让GEORADIUS命令在返回被匹配位置的同时,将这些位置的坐标也一并返回。
GEORADIUS命令在默认情况下会以无序方式返回被匹配的位置,但是通过使用可选的ASC选项或DESC选项,用户可以改变这一行为,让GEORADIUS命令以有序方式返回结果。
如果用户使用了ASC选项,那么GEORADIUS将根据中心点与被匹配位置之间的距离,按照由近到远的顺序返回被匹配的位置。
通过可选的COUNT选项,我们可以限制命令返回的最大位置数量。
GEORADIUSBYMEMBER:查找指定位置半径范围内的其他位置
GEORADIUSBYMEMBER命令通过选择位置集合中的一个位置作为中心点。
GEOHASH:获取指定位置的Geohash值
redis> GEOHASH Guangdong-cities Qingyuan Guangzhou Shenzhen
"ws0w0phgp70" -- 清远市经纬度坐标的Geohash值
"ws0e89curg0" -- 广州市经纬度坐标的Geohash值
"ws107659240" -- 深圳市经纬度坐标的Geohash值
GEORADIUS命令和GEORADIUSBYMEMBER命令都支持WITHHASH选项,使用了这个选项的命令将会在结果中包含被匹配位置的Geohash值。
需要注意的是,与GEOHASH命令不一样,GEORADIUS命令和GEORADIUSBYMEMBER命令返回的是被解释为数字的Geohash值。而GEOHASH命令返回的则是被解释为字符串的Geohash值。比如GEOHASH命令在获取清远市的Geohash值时返回的是字符串"ws0w0phgp70",而GEORADIUS命令获取的Geohash值却是数字4046597933543051,不过这两个值底层的二进制位是完全相同的。
除了GEOADD之外,包括GEOPOS、GEODIST、GEORADIUS、GEORADIUSBYMEMBER和GEOHASH在内的所有GEO命令都是在有序集合的基础上实现的,这也使得我们可以直接使用有序集合命令对位置集合进行操作。