redis的GEO实战 (RedisTemplate)

geoadd

时间复杂度为O(log(N))

geoadd cityGeo 116.405285 39.904989 “北京”
geoadd cityGeo 121.472644 31.231706 “上海”
添加经纬度信息
geopos
时间复杂度为O(log(N))

127.0.0.1:6379> geopos cityGeo 北京
1) 1) “116.40528291463851929”
2) “39.9049884229125027”
查找指定key的经纬度信息,可以指定多个key,批量返回
geodist
时间复杂度为O(log(N))

127.0.0.1:6379> geodist cityGeo 北京 上海
“1067597.9668”
127.0.0.1:6379> geodist cityGeo 北京 上海 km
“1067.5980”
返回两个地方的距离,可以指定单位,比如米m,千米km,英里mi,英尺ft
georadius
时间复杂度为O(N+log(M)),N为指定半径范围内的元素个数,M为要返回的个数

georadius cityGeo 116.405285 39.904989 100 km WITHDIST WITHCOORD ASC COUNT 5
根据给定的经纬度,返回半径不超过指定距离的元素
可以指定WITHDIST返回距离,WITHCOORD返回经纬度,WITHHASH返回geohash值
可以指定ASC或DESC,根据距离来排序
可以指定COUNT限定返回的记录数
georadiusbymember
时间复杂度为O(log(N)+M),N为指定半径范围内的元素个数,M为要返回的个数

georadiusbymember cityGeo 北京 100 km WITHDIST WITHCOORD ASC COUNT 5
根据指定的地点查询半径在指定范围内的位置
可以指定WITHDIST返回距离,WITHCOORD返回经纬度,WITHHASH返回geohash值
可以指定ASC或DESC,根据距离来排序
可以指定COUNT限定返回的记录数
geohash
查找一个位置的时间复杂度为O(log(N))

127.0.0.1:6379> geohash cityGeo 北京
1) “wx4g0b7xrt0″
返回的是geohash值
RedisTemplate的GEO使用实例
@Test
public void testAdd(){
Long addedNum = redisTemplate.opsForGeo()
.add(cityGeoKey,new Point(116.405285,39.904989),”北京”);
System.out.println(addedNum);
}

@Test
public void testGeoGet(){
List

redis目前已经到了3.2版本,3.2版本里面新增的一个功能就是对GEO(地理位置)的支持。

地理位置大概提供了6个命令,分别为:

GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

具体的功能如下:

命令:GEOADD key longitude latitude member [longitude latitude member …]

命令描述:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。

返回值:添加到sorted set元素的数目,但不包括已更新score的元素。

命令:GEODIST key member1 member2 [unit]

命令描述:

返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个:

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

命令:GEOPOS key member [member …]

命令描述:从key里返回所有给定位置元素的位置(经度和纬度)。

返回值:GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。当给定的位置元素不存在时, 对应的数组项为空值。

命令:GEOHASH key member [member …]

命令描述:返回一个或多个位置元素的 Geohash 表示。通常使用表示位置的元素使用不同的技术,使用Geohash位置52点整数编码。由于编码和解码过程中所使用的初始最小和最大坐标不同,编码的编码也不同于标准。此命令返回一个标准的Geohash

返回值:一个数组, 数组的每个项都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。

命令:GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

命令描述:

以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

范围可以使用以下其中一个单位:

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

在给定以下可选项时, 命令会返回额外的信息:

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

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

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

在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT

返回值:

在没有给定任何 WITH 选项的情况下, 命令只会返回一个像 [“New York”,”Milan”,”Paris”] 这样的线性(linear)列表。
在指定了 WITHCOORD 、 WITHDIST 、 WITHHASH 等选项的情况下, 命令返回一个二层嵌套数组, 内层的每个子数组就表示一个元素。

在返回嵌套数组时, 子数组的第一个元素总是位置元素的名字。 至于额外的信息, 则会作为子数组的后续元素, 按照以下顺序被返回:

以浮点数格式返回的中心与位置元素之间的距离, 单位与用户指定范围时的单位一致。
geohash 整数。
由两个元素组成的坐标,分别为经度和纬度。

命令:GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

命令描述:这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的。

Original: https://www.cnblogs.com/lykbk/p/15871615.html
Author: 微笑点燃希望
Title: redis的GEO实战 (RedisTemplate)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/528926/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Debian目录的生成及打包

    故事背景 做linux开发的一般都会涉及到deb包,那么我们如何制作deb包,debian目录中都有哪些文件以及他们的含义是什么呢?那么我们就带着这些疑惑去探索了。 探索之路 首先…

    Linux 2023年5月27日
    0146
  • redis数据库

    这一次主要是接着redis服务器接着进行代码讲解,因为redis服务器中包含大量的数据库,因为redis也对每个数据库设计了结构体 redis数据库 在上面 redisServer…

    Linux 2023年6月13日
    0100
  • 宝塔配置vnc+wine实现Q群机器人

    图形界面必备 X Window System yum -y groupinstall "X Window System" 安装epel源 yum -y inst…

    Linux 2023年5月27日
    0103
  • 数据转换-16进制字符

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 在utils.h和utils.c中完成16进制字符’0′-&#…

    Linux 2023年6月8日
    090
  • KVM http网络加载镜像报错(mount: wrong fs type, bad option, bad superblock on /dev/loop0)

    curl: (23) Failed writing body (7818 != 16384)loop: module loadeddracut-initqueue[579]: mo…

    Linux 2023年6月6日
    0150
  • Vue 3-150行代码实现新国标红绿灯效果案例

    昨天刷视频,都是关于新国标红绿灯的,看大家议论纷纷,下班就用150行代码通过Vue组件实践红绿模拟演示,视频也跟大家展示过了。今天接着更新图文版本,大家跟着优雅哥通过该案例实操模拟…

    Linux 2023年6月7日
    082
  • VMware服务关闭后一定要重启

    重要的事情说三遍:服务暂时关闭记得重启,服务暂时关闭记得重启,服务暂时关闭记得重启!!! VMware服务由于安装补丁的需要我暂时把服务关闭了,于是我遇到了尴尬的一幕,于是乎发现上…

    Linux 2023年6月7日
    0121
  • 关于如何在Idea下进行多子项目及引用内部子项目情况下打包项目的方法

    近期在开发Java的时候遇到了如下的打包上的问题 需要将一个工程下面的子工程分别打包 有的子工程还包含了另一个子工程 在这种情况下打包会出现找不到子模块的情况。 JDK:1.8 开…

    Linux 2023年6月14日
    0100
  • 2020年12月-第02阶段-前端基础-CSS Day07

    CSS Day07 CSS高级技巧 *理解 能说出元素显示隐藏最常见的写法能说出精灵图产生的目的能说出去除图片底侧空白缝隙的方法 *应用 能写出最常见的鼠标样式能使用精灵图技术能用…

    Linux 2023年6月8日
    0133
  • 在linux中使用tcpdump抓包的方法:

    在linux中使用tcpdump抓包的方法: 1,运行下面命令来从所有网卡中捕获数据包: tcpdump -i any 2,从指定网卡中捕获数据包 tcpdump -i eth0 …

    Linux 2023年5月27日
    0123
  • 后端编写Swagger接口管理文档

    在后端开发当中,编写好多个接口后需要通过注解编写相应的接口文档提供给前端调用接口实现前后端分离。 Swagger接口管理文档 访问接口文档的网页:http://localhost:…

    Linux 2023年6月7日
    098
  • Linux之虚拟专用网络—VPN

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    0118
  • PyTorch介绍-优化模型参数

    既然已经有模型和数据了,是时候在数据上优化模型参数来训练、验证和测试它了。模型训练是一个迭代过程;在每一次迭代( epoch),模型会作出一个预测,计算其预测误差( loss),收…

    Linux 2023年6月14日
    0110
  • shell内置命令和外部命令的区别

    shell内置命令和外部命令的区别 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行…

    Linux 2023年6月7日
    084
  • Docker-compose资源编排

    Docker-compose 1.简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管…

    Linux 2023年6月13日
    0112
  • python获取Windows硬件特征信息

    1.python pip安装WMI 并用pyinstaller编译出device_chk.exe 参考内容:https://blog.csdn.net/fengmm521/arti…

    Linux 2023年6月7日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球