前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis | Redis 也会算距离

Redis | Redis 也会算距离

作者头像
码农UP2U
发布2021-11-10 14:55:31
发布2021-11-10 14:55:31
76000
代码可运行
举报
文章被收录于专栏:码农UP2U码农UP2U
运行总次数:0
代码可运行
之前整理的关于 Redis 的思维导图如下:

本次接着整理 Redis 关于 Geo 命令相关的内容。先来看下关于这部分的思维导图,如下图所示。

从上图可以看出,关于 Geo 的命令只有 6 条,下面分别来演示一下上面的命令。

一、添加信息

使用 geoadd 命令可以轻松的添加经纬度坐标信息,并且可以给经纬度坐标进行命名。本次我使用 Windows 下的 Redis 来进行演示。命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 命令的用法,用法如下:

代码语言:javascript
代码运行次数:0
运行
复制
GEOADD key longitude latitude member [longitude latitude member ...]

对应上面的命令可以看出,pos 是 geoadd 的 key,在 pos 后是经纬度坐标,在经纬度坐标后面是该经纬度坐标自定义的名称。这里,可以通过一条 geoadd 命令添加多个经纬度坐标进去。

注:经纬度坐标我是直接从百度拾取坐标系统中获取的,百度拾取坐标系统的 url 如下:

代码语言:javascript
代码运行次数:0
运行
复制
http://api.map.baidu.com/lbsapi/getpoint/index.html

geoadd 添加的坐标,实际使用的是 zset 结构。使用 zrange 进行查看。

代码语言:javascript
代码运行次数:0
运行
复制
127.0.0.1:6379> zrange pos 0 100
1) "zhongbeiedu"
2) "qingchuang"
3) "yingzepark"
4) "nanzhan"

二、获取坐标信息

通过 geopos 可以获取 geoadd 添加的坐标信息,geopos 可以获取一个坐标,也可以获取多条坐标,命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 用来计算两个元素之间的距离。在计算距离的时候,可以指定距离的单位,比如 米 或 千米。命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 命令的使用,命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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,命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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,命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 两个参数也可以同时使用,命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 了。命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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 集合,命令如下:

代码语言:javascript
代码运行次数:0
运行
复制
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"
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农UP2U 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档