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

Redis | Redis 也会算距离

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

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

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

一、添加信息

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

代码语言:javascript
复制
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
复制
GEOADD key longitude latitude member [longitude latitude member ...]

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

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

代码语言:javascript
复制
http://api.map.baidu.com/lbsapi/getpoint/index.html

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

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

二、获取坐标信息

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

代码语言:javascript
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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
复制
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 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档