Redis | Redis 也会算距离

19 篇文章 0 订阅
15 篇文章 0 订阅

图片

        之前整理的关于 Redis 的文章:

Redis | Redis 的安装

Redis | Redis 的帮助命令

Redis | Redis 命令分类

Redis | Redis 通用命令

Redis | Redis 字符串相关命令

Redis | Redis 列表相关命令

Redis | Redis 集合相关命令

Redis | Redis 有序集合相关命令

Redis | Redis 哈希相关命令

Redis | 源码阅读 —— 字符串

Redis | 源码阅读 —— 链表

Redis | Redis Pub/Sub相关命令

Redis | 管道 —— PipeLine

Redis | SpringBoot整合Redis

Redis | Redis 的事务一

Redis | Redis 的事务二

Redis | 基础数据类型应用场景

Redis | 事务源码阅读

Redis | 事物源码阅读 —— watch

Redis | 慢查询

Redis | 给接口添加缓存

目录

一、添加信息

二、获取坐标信息

三、计算距离

四、获取附近的信息

五、总结


        之前整理的关于 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"

早期文章

图片

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农UP2U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值