首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis 的 GEO 特性

Redis 的 GEO 特性

作者头像
魔王卷子
发布于 2019-06-02 05:10:37
发布于 2019-06-02 05:10:37
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

今天看文档,无意中发现了 Redis 的一个新功能。 Redis 在 3.2 版本实现了一个地理位置计算的特性。

版本要求

Redis 3.2 或者更新

添加和获取位置

geoadd (添加位置)

这个命令对于经纬度是有要求的:

  • 有效的经度从-180度到180度。
  • 有效的纬度从-85.05112878度到85.05112878度。

如果超出返回,那么命令就会返回一个错误.

添加命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEOADD location-set longitude latitude name [longitude latitude name ...]

这个可以同时添加多个位置。其中 location-set 是存储地理位置的集合名称,longitudelatitudename 则是地理位置的精度、纬度、名字。

下面添加北京的地铁站的坐标:

添加单个位置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geoadd subways 116.404269 39.906543 qianmen
(integer) 1

添加多个位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geoadd subways 116.409465 39.939578 nanluoguxiang 116.402549 39.944163 shichahai 116.315934 40.005471 yuanmingyuan 116.399279 40.007208 aolinpikegongyuan
(integer) 4

将坐标记录到位置集合之后,我们使用 geopos 命令来获取位置的名字和具体经纬度

获取命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEOPOS location-set name [name ...]

比如说,如果我们想要获取圆明园、前门的经纬度,那么我们就可以执行以下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geopos subways yuanmingyuan qianmen
1) 1) "116.31593316793441772"
   2) "40.00546983911101506"
2) 1) "116.40426903963088989"
   2) "39.90654220698316834"

计算两个点之前的距离

命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEODIST location-set location-x location-y [unit]

可选参数 unit 用于指定计算距离时的单位,它的值为下面的一个:

  • m 表示单位为米。
  • km 表示单位为千米。
  • mi 表示单位为英里。
  • ft 表示单位为英尺。

比如我们要计算奥林匹克公园和圆明园的距离:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geodist subways yuanmingyuan aolinpikegongyuan
"7103.4924"

如果我们指定单位为 km

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geodist subways yuanmingyuan aolinpikegongyuan km
"7.1035"

获取指定范围内的元素

Redis 提供了两种方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEORADIUS location-set longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

GEORADIUSBYMEMBER location-set location radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count]

这两个命令都是用来查找特定范围地点的功能,但是指定中心点的方式不同:georadius 使用的是用户给定的经纬度,而 georadiusbymember 则使用存储在位置集合里面的某个地点作为中心点。

  • m|km|ft|mi 指定的是计算范围时的单位;
  • 如果给定了可选的 WITHCOORD , 那么命令在返回匹配的位置时会将位置的经纬度一并返回;
  • 如果给定了可选的 WITHDIST , 那么命令在返回匹配的位置时会将位置与中心点之间的距离一并返回;
  • 在默认情况下, GEORADIUS 和 GEORADIUSBYMEMBER 的结果是未排序的, ASC 可以让查找结果根据距离从近到远排序, 而 DESC 则可以让查找结果根据从远到近排序;
  • COUNT 参数指定要返回的结果数量。

命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

  • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
  • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

比如说我们要返回指定坐标的10km内的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km
1) "qianmen"
2) "nanluoguxiang"
3) "shichahai"

我们还需要获取位置与中心点的距离:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist
1) 1) "qianmen"
   2) "0.9349"
2) 1) "nanluoguxiang"
   2) "2.7812"
3) 1) "shichahai"
   2) "3.2521"

我们需要返回按照最远距离排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist desc
1) 1) "shichahai"
   2) "3.2521"
2) 1) "nanluoguxiang"
   2) "2.7812"
3) 1) "qianmen"
   2) "0.9349"

我们只需要两个就够了,三个太多了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist desc count 2
1) 1) "shichahai"
   2) "3.2521"
2) 1) "nanluoguxiang"
   2) "2.7812"
127.0.0.1:6379> georadius subways 116.403878 39.914942 10 km withdist count 2
1) 1) "qianmen"
   2) "0.9349"
2) 1) "nanluoguxiang"
   2) "2.7812"

获取前门10km附近的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> georadiusbymember subways qianmen 10 km
1) "qianmen"
2) "nanluoguxiang"
3) "shichahai"

我们只是需要将其坐标换成集合名称中的会员名称就好了,用法跟之前的georadius相同。

georadiusgeoradiusbymember执行的代价并不低,因此强烈建议为查询结果创建缓存。

geohash

这个会返回一个11个字符的geohash字符串,使用内部52位表示。返回的geohashes具有以下特性:

  • 他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
  • 它可以在 geohash.org 网站使用,网址http://geohash.org/。查询例子:http://geohash.org/sqdtr74hyu0.
  • 与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。

命令格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GEOHASH key member [member ...]

例如我要查询前门的geohash:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6379> geohash subways qianmen
1) "wx4g0bg02n0"

完了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-172,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
传输层
本篇是第三章传输层(书中翻译为运输层,故下面运输层和传输层可能会同时出现,anyway反正一个意思),主要关注TCP和UDP,还有注意拥塞控制
中龙技术
2022/09/30
5820
传输层
计算机网络原理梳理丨传输层
传输层协议提供逻辑通信服务 传输层协议只需在端系统中实现 通信的真正断电并不是主机,而是主机中运行的应用进程
码脑
2019/04/11
1.1K0
计算机网络原理梳理丨传输层
计算机网络(五) 运输层
运输层向它上面的应用层提供通信服务,它属于面向通信部份的最高层,也是用户功能中的最低层
赤蓝紫
2023/01/02
6520
计算机网络(五)    运输层
传输层Stu
** 为运行在不同主机上的应 用进程提供逻辑通信 ** ** 传输协议运行在端系统 **
用户11097514
2024/05/31
1020
传输层Stu
自顶向下 | 带你遨游运输层
操作系统提供了被称为 socket 的接口 api 供编程人员调用,对 socket 的形象理解是其是一种抽象,将复杂的实现 (tcp/udp) 协议的各种行为抽形成简单的几个函数给开发人员使用。就像浏览器将发送请求报文这一 http 协议规定的行为,抽象成我们只需要输入 url 然后回车即可
码农编程进阶笔记
2021/07/20
7600
计算机网络基础知识笔记(四)
运输层是整个网络体系结构中的关键层次之一。本文讨论TCP/IP体系中运输层最重要的两种协议:TCP/UDP。必须理解TCP的各种机制(面向连接的可靠服务、流量控制、拥塞控制等)以及TCP连接管理。   进程间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
互联网金融打杂
2018/04/03
7580
计算机网络基础知识笔记(四)
计算机网络通信TCP/IP协议浅析 网络发展简介(二)
首先从网络协议分层的概念进行介绍,然后对TCP、IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket
noteless
2019/02/25
8210
计算机网络通信TCP/IP协议浅析 网络发展简介(二)
计算机网络基础知识整理--运输层
从IP层来说,通信的两端是两个主机。IP数据报的首部明确地标志了这两个主机的IP地址。我们需要知道,真正进行通信的实体是在主机中的进程,是这个主机中的一个进程和另一个主机中的进程在交换数据(即通信)。因此严格地讲,两个主机进行通信就是两个主机中的应用进程进行通信。IP协议虽然等把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点并不是主机而是主机中的进程。也就是说,端到端的通信是应用进程之间的通信。
黄桂期
2018/05/11
2.1K2
计算机网络的 89 个核心概念
Hey guys,这里是 cxuan,欢迎你阅读我最新一期的文章,大家知道,我连载计算机网络已经有一定时间了,当我每了解一个新技术或者新框架的时候,我都想要先把名字概念弄懂是什么,可见概念对于我们的帮助非常大。计算机网络中的概念也是非常庞杂,理解起来比较困难,所以这里,我给大家汇总了计算机网络中 89 个常见的概念,希望对你有所帮助。
cxuan
2021/07/12
6320
计算机网络的 89 个核心概念
计算机网络笔记
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MpQfb1s0-1608798516405)(C:/Users/SXF/Desktop/a.jpg)] 12. 对等层次之间传送的数据单位称为该层的 协议数据单元PDU 13. 在同一系统中相邻两层的实体进行交互的地方,称为 服务访问点SAP 14. 计算机网络的各层及其协议的集合,称为 网络的体系结构 15. 运输层最重要的协议是 TCP和UDP协议 ,网络层最重要的协议是 IP协议
小锋学长生活大爆炸
2025/05/24
1200
计算机网络学习笔记-传输层
二者都是在IP提供的服务的基础之上提供服务(IP提供的服务:best effort) 二者都不能提供的服务:
花猪
2022/02/16
1.3K0
计算机网络学习笔记-传输层
计算机网络之传输层-复用与分解
多路复用: 在源主机, 传输层协议从不同的套接字收集应用进程发送的数据块, 并为每个数据块封装上首部信息( 包括用于分解的信息) 构成报文段, 然后将报文段传递给网络层。
越陌度阡
2020/11/26
1.3K0
计算机网络之传输层-复用与分解
计算机网络学习--传输层
第一章 概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层
shimeath
2020/08/01
4230
计算机网络学习--传输层
计算机网络之运输层1 功能2 UDP与TCP异同可靠传输的工作原理可靠传输的实现TCP 报文段的首部格式TCP 的流量控制TCP的拥塞控制
1 功能 1.1 进程间通信 从通信和信息处理的角度看,运输层向应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端
JavaEdge
2018/05/16
1.3K0
传输层协议TCP与UDP
主机是用IP地址来标识的,而要标识主机中的进程,就需要使用端口号。TCP/IP协议族中,端口号占16 bit,用0~65535之间的整数标识。TCP和UDP是两个独立的软件模块,因此各自的端口号也相互独立。·端口号只具有本地意义,不同计算机的相同端口号是没有联系的。
十二惊惶
2024/02/28
7320
传输层协议TCP与UDP
运输层
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
Java3y
2018/09/14
8460
运输层
传输层 复习
1.UDP是无连接的,即在发送数据之前不需要建立连接,减少了开销和发送数据之前的时延;
20岁爱吃必胜客
2022/11/12
4800
传输层 复习
计算机网络之传输层
从通信和信息处理两方面来看,“传输层”既是面向通信部分的最高层,与下面的三层一起共同构建进行网络通信所需的线路和数据传输通道,同时又是面向用户的最低层,因为无论何种网络应用,最终都需要把各种数据报传送到对方。来自应用层的用户数据必须依靠传输层协议在不同网络中的主机间进行传输,因为仅靠网络层把数据传送到目的主机上还是不够的,还必须把它交给目的主机的应用进程。
CodeGoat24
2022/02/27
2.2K6
计算机网络之传输层
看懂「www.google.com」背后的逻辑
在前两篇文章中,我们完整的描述了计算机网络 OSI 五层模型的相关内容。那么,本篇将会从一个实践案例开始,带你从整体上重新认识我们的计算机网络。
Single
2018/07/31
9150
看懂「www.google.com」背后的逻辑
TCP/IP笔记——UDP
OSI模型中最下面的两层用来解决两个硬件设备在物理上的通信问题(如规定怎么将电平信号转换为数字信号),相对应的TCP/IP模型中,这部分代表将会将机器封装为一个MAC地址来实现通讯。网络层是关于,具体到应该由谁、哪一个设备来接受传输的信号,所以对应的TCP/IP模型中,用IP地址来表示“接收方”的地址,用于建立连接。
太阳影的社区
2021/10/15
6860
相关推荐
传输层
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验