之前整理的关于 Redis 的思维导图如下:
本次接着整理 Redis 关于 Geo 命令相关的内容。先来看下关于这部分的思维导图,如下图所示。
从上图可以看出,关于 Geo 的命令只有 6 条,下面分别来演示一下上面的命令。
一、添加信息
使用 geoadd 命令可以轻松的添加经纬度坐标信息,并且可以给经纬度坐标进行命名。本次我使用 Windows 下的 Redis 来进行演示。命令如下:
127.0.0.1:6379> geoadd pos 112.617168 37.796849 nanzhan (integer) 1 127.0.0.1:6379> geoadd pos 112.552309 37.80035 qingchuang (integer) 1 127.0.0.1:6379> geoadd pos 112.566988 37.860711 yingzepark (integer) 1 127.0.0.1:6379> geoadd pos 112.453582 38.02132 zhongbeiedu (integer) 1
从上面的命令中,每行命令添加了一个坐标,看一下 geoadd 命令的用法,用法如下:
GEOADD key longitude latitude member [longitude latitude member ...]
对应上面的命令可以看出,pos 是 geoadd 的 key,在 pos 后是经纬度坐标,在经纬度坐标后面是该经纬度坐标自定义的名称。这里,可以通过一条 geoadd 命令添加多个经纬度坐标进去。
注:经纬度坐标我是直接从百度拾取坐标系统中获取的,百度拾取坐标系统的 url 如下:
http://api.map.baidu.com/lbsapi/getpoint/index.html
geoadd 添加的坐标,实际使用的是 zset 结构。使用 zrange 进行查看。
127.0.0.1:6379> zrange pos 0 100 1) "zhongbeiedu" 2) "qingchuang" 3) "yingzepark" 4) "nanzhan"
二、获取坐标信息
通过 geopos 可以获取 geoadd 添加的坐标信息,geopos 可以获取一个坐标,也可以获取多条坐标,命令如下:
127.0.0.1:6379> geopos pos nanzhan 1) 1) "112.61716693639755" 2) "37.796848161084498" 127.0.0.1:6379> geopos pos zhongbeiedu qingchuang 1) 1) "112.45358437299728" 2) "38.021320532234391" 2) 1) "112.55231112241745" 2) "37.800351145726701"
通过 geopos 获得到了相应的坐标,但是仔细观察,获取到的坐标和 geoadd 时的坐标稍有不同。这是因为坐标存储时是有损的,通过有损的存储再读取就稍有差别。但是,对于细小的差别来说,对业务的使用影响并不大,毕竟这点误差用户是可以接受的。
三、计算距离
接下来这个命令可以在业务场景中使用,geodist 用来计算两个元素之间的距离。在计算距离的时候,可以指定距离的单位,比如 米 或 千米。命令如下:
127.0.0.1:6379> geodist pos zhongbeiedu nanzhan m "28799.9702" 127.0.0.1:6379> geodist pos zhongbeiedu nanzhan km "28.8000"
在上面的命令中 m 和 km 分别用来表示 米 和 千米。通过 geodist 就可以方便的得出两点之间的距离了。
四、获取附近的信息
获取附近的信息有两个命令,分别是 georadiusbymember 和 georadius 命令。georadiusbymember 通过指定的元素可以获得指定半径范围内的其他元素,georadiu 通过指定一个经纬度坐标来获得指定半径范围内的元素。
先来查看 georadiusbymember 命令的使用,命令如下:
127.0.0.1:6379> georadiusbymember pos nanzhan 10 km 1) "qingchuang" 2) "yingzepark" 3) "nanzhan" 127.0.0.1:6379> georadiusbymember pos nanzhan 10 km asc 1) "nanzhan" 2) "qingchuang" 3) "yingzepark"
上面的命令用来查询 nanzhan 半径 10 千米范围内的元素,命令默认使用 由远到近 的顺序输出,如果需要 由近到远 的顺序输出,可以增加 asc 的参数。
如果想要知道它们之间的具体距离是多远,可以增加参数 withdist,命令如下:
127.0.0.1:6379> georadiusbymember pos nanzhan 10 km withdist asc 1) 1) "nanzhan" 2) "0.0000" 2) 1) "qingchuang" 2) "5.7133" 3) 1) "yingzepark" 2) "8.3599"
这样可以看到距离每个元素之间的具体距离。如果想要知道每个元素的坐标,可以增加参数 withcoord,命令如下:
127.0.0.1:6379> georadiusbymember pos nanzhan 10 km withcoord asc 1) 1) "nanzhan" 2) 1) "112.61716693639755" 2) "37.796848161084498" 2) 1) "qingchuang" 2) 1) "112.55231112241745" 2) "37.800351145726701" 3) 1) "yingzepark" 2) 1) "112.56698817014694" 2) "37.860710460694044"
withcoord 和 withdist 两个参数也可以同时使用,命令如下:
127.0.0.1:6379> georadiusbymember pos nanzhan 10 km withcoord withdist asc 1) 1) "nanzhan" 2) "0.0000" 3) 1) "112.61716693639755" 2) "37.796848161084498" 2) 1) "qingchuang" 2) "5.7133" 3) 1) "112.55231112241745" 2) "37.800351145726701" 3) 1) "yingzepark" 2) "8.3599" 3) 1) "112.56698817014694" 2) "37.860710460694044"
接着再来介绍 georadius 命令,它可以通过经纬度坐标来查询指定半径范围内的元素,这样在业务中获取当前用户的经纬度坐标,就可以搜索附近的 XXX 了。命令如下:
127.0.0.1:6379> georadius pos 112.593887 37.866154 20 km withdist asc 1) 1) "yingzepark" 2) "2.4384" 2) 1) "nanzhan" 2) "7.9753" 3) 1) "qingchuang" 2) "8.1797"
在 georadiusbymember 命令中可以使用的 withdist 和 withcoord 两个参数,在 georadius 命令中同样可以使用。
五、总结
上面介绍了关于 Geo 的 5 条命令,剩下的一条命令返回一个 Hash 值,这里具体不再进行介绍。那么可以通过 geoadd 添加经纬度坐标信息,那么如何删除呢?通过 zrem 即可删除,因为它是一个 zset 集合,命令如下:
127.0.0.1:6379> zrem pos zhongbeiedu (integer) 1 127.0.0.1:6379> zrange pos 0 100 1) "qingchuang" 2) "yingzepark" 3) "nanzhan"