返回顶部
首页 > 资讯 > 数据库 >Redis中的GEO地理位置模块怎么用
  • 354
分享到

Redis中的GEO地理位置模块怎么用

2024-04-02 19:04:59 354人浏览 独家记忆
摘要

这篇文章主要介绍了Redis中的GEO地理位置模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GEO是 Redis 在3.2版本之后

这篇文章主要介绍了Redis中的GEO地理位置模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

GEO是 Redis 在3.2版本之后新增的地理位置模块,意味可以用 Redis 来实现附近的地点功能。【相关推荐:Redis视频教程

用数据库计算

Redis中的GEO地理位置模块怎么用

一般的方法都是通过矩形区域来限定元素的数量,然后对区域内的元素进行全量距离计算再排序。这样可以明显减少计算量。

select id from positions where x0-r < x < x0+r and y0-r < y < y0+r

以上sql为了增加性能,需要在经纬度坐标加上双向复合索引。 但是数据库查询性能毕竟有限,如果在高并发场合,这可能并不是一个很好的方案。

GEO算法

  • 业界比较通用的地理位置距离排序算法GeoHash 算法,Redis 也使用 GeoHash 算法。

  • GeoHash 算法将 二维的经纬度数据映射到一维的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。当我们想要计算「附近的人时」,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。

  • 算法实现,它将整个地球看成一个 二维平面,然后划分成了一系列正方形的方格,就好比围棋棋盘。所有的地图元素坐标都将放置于唯一的方格中。方格越小,坐标越精确。然后对这些方格进行整数编码,越是靠近的方格编码越是接近。

  • 编码之后,每个地图元素的坐标都将变成一个整数,通过这个整数可以还原出元素的坐标,整数越长,还原出来的坐标值的损失程度就越小。

  • GeoHash 算法会继续对这个整数做一次 base32 编码 (0-9,a-z 去掉 a,i,l,o 四个字母) 变成一个字符串

  • 在 Redis 里面,经纬度使用 52 位的整数进行编码,放进了 zset 里面,zsetvalue 是元素的 keyscoreGeoHash 的 52 位整数值。

  • 在使用 Redis 进行 Geo 查询时,我们要时刻想到它的内部结构实际上只是一个 zset(skiplist)。通过 zsetscore 排序就可以得到坐标附近的其它元素 (实际情况要复杂一些,不过这样理解足够了),通过将 score 还原成坐标值就可以得到元素的原始坐标。

Redis GEO指令

Redis中的GEO地理位置模块怎么用

1. 增加 geoadd

geoadd key longitude latitude member [longitude latitude member ...]
127.0.0.1:6379> geoadd beijing 116.403856 39.924043 guGong
(integer) 1
127.0.0.1:6379> geoadd beijing 116.343620 39.947633 dongwuyuan
(integer) 1
127.0.0.1:6379> geoadd beijing 116.328643 39.900272 xizhan 116.415324 39.931231 meishuguan 116.416852 39.887607 tiantan
(integer) 3

删除用 zset 的 zrem 即可

2. 距离 geodist

geodist key member1 member2 [unit]
127.0.0.1:6379> geodist beijing gugong xizhan km
"6.9402"
127.0.0.1:6379> geodist beijing gugong dongwuyuan   # 默认单位m
"5768.5737"
127.0.0.1:6379> geodist beijing xizhan xizhan
"0.0000"

距离单位可以是 m、km、ml、ft,分别代表米、千米、英里和尺。

3. 位置 geopos

geopos key member [member ...]
127.0.0.1:6379> geopos beijing gugong
1) 1) "116.4038559794426"
   2) "39.92404192186725"
127.0.0.1:6379> geopos beijing tiantan xizhan
1) 1) "116.41685396432877"
   2) "39.887607839922914"
2) 1) "116.32864147424698"
   2) "39.900271306834973"

4. hash值 geohash

geohash key member [member ...]
127.0.0.1:6379> geohash beijing gugong
1) "wx4g0gfwqk0"

经纬度字符串编码是 base32 编码,可以通过 Http://geohash.org/wx4g0gfwqk0 直接查找经纬度

5. 附近地点 georadiusbymember

1、查询 ireader 范围 20 公里以内最多 3 个元素按距离正排,它不会排除自身(倒排使用用 desc

127.0.0.1:6379> georadiusbymember company ireader 20 km count 3 asc
1) "ireader"
2) "juejin"
3) "meituan"

2、三个可选参数 withcoord withdist withhash 用来携带附加参数, withdist 很有用,它可以用来显示距离

georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
127.0.0.1:6379> georadiusbymember beijing gugong 5 km withcoord withdist withhash count 3 asc
1) 1) "gugong"
   2) "0.0000"
   3) (integer) 4069885568932443
   4) 1) "116.4038559794426"
      2) "39.92404192186725"
2) 1) "meishuguan"
   2) "1.2634"
   3) (integer) 4069885710390435
   4) 1) "116.41532510519028"
      2) "39.93123039107514"
3) 1) "tiantan"
   2) "4.2014"
   3) (integer) 4069885398502557
   4) 1) "116.41685396432877"
      2) "39.887607839922914"

3、根据坐标值来查询附近的元素

 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DES]
127.0.0.1:6379> georadius beijing 116.383882 39.922061 5 km withcoord withdist withhash count 3 asc
1) 1) "gugong"
   2) "1.7180"
   3) (integer) 4069885568932443
   4) 1) "116.4038559794426"
      2) "39.92404192186725"
2) 1) "meishuguan"
   2) "2.8693"
   3) (integer) 4069885710390435
   4) 1) "116.41532510519028"
      2) "39.93123039107514"
3) 1) "dongwuyuan"
   2) "4.4588"
   3) (integer) 4069879836419688
   4) 1) "116.34361892938614"
      2) "39.94763257169722"

注意事项

实际应用中数据可能会有百万千万条,我们知道 Redis Geo 将全部放在一个 zset 集合中。在 Redis 的集群环境中,集合可能会从一个节点迁移到另一个节点,如果单个 key 的数据过大,会对集群的迁移工作造成较大的影响,在集群环境中单个 key 对应的数据量不宜超过 1M,否则会导致集群迁移出现卡顿现象,影响线上服务的正常运行。

所以,这里建议 Geo 的数据使用单独的 Redis 实例部署,不使用集群环境。

如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。这样就可以显著降低单个 zset 集合的大小。

感谢你能够认真阅读完这篇文章,希望小编分享的“Redis中的GEO地理位置模块怎么用”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: Redis中的GEO地理位置模块怎么用

本文链接: https://lsjlt.com/news/70450.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis中的GEO地理位置模块怎么用
    这篇文章主要介绍了Redis中的GEO地理位置模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GEO是 Redis 在3.2版本之后...
    99+
    2024-04-02
  • Redis之GEO存储地理位置信息的使用
    目录常用APIgeoaddgeoposgeodistgeoradiusbymembergeohash在外卖软件中的附近的美食店铺、外卖小哥的距离,打车软件附近的车辆,交友软件中附近的...
    99+
    2024-04-02
  • Redis GEO 类型与 API 结合,地理位置优化的绝佳实践
    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、...
    99+
    2023-10-12
    redis 数据库 缓存
  • HTML5中Geolocation地理位置定位API怎么用
    这篇文章将为大家详细讲解有关HTML5中Geolocation地理位置定位API怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基本用法 首先,我们可以从浏...
    99+
    2024-04-02
  • HTML5的地理位置功能怎么用
    这篇文章主要讲解了“HTML5的地理位置功能怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML5的地理位置功能怎么用”吧! 这是一个 HTML5...
    99+
    2024-04-02
  • HTML5中怎么使用地理位置实现定位功能
    本篇内容介绍了“HTML5中怎么使用地理位置实现定位功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们...
    99+
    2024-04-02
  • Node.js中的内置模块怎么用
    这篇“Node.js中的内置模块怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js中的内置模块怎么用”文章吧...
    99+
    2023-06-17
  • Redis高效检索地理位置的原理解析
    Redis GEO 用做存储地理位置信息,并对存储的信息进行操作。通过geo相关的命令,可以很容易在redis中存储和使用经纬度坐标信息。Redis中提供的Geo命令有如下几个: ...
    99+
    2024-04-02
  • Nginx中的服务器块和位置块怎么配置
    在Nginx配置文件中,服务器块(server block)用来定义一个虚拟主机(virtual host),包含了该虚拟主机的配置...
    99+
    2024-04-03
    Nginx 服务器
  • 怎么使用Flutter定位包获取地理位置
    本篇内容介绍了“怎么使用Flutter定位包获取地理位置”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Flutter 中获取地理位置如今,发...
    99+
    2023-06-21
  • HTML5中怎么获取地理位置信息
    HTML5中怎么获取地理位置信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。如何使用HTML5地理位置定位功能定位功能(Geolocatio...
    99+
    2024-04-02
  • node中的fs模块、path模块怎么用
    本篇内容主要讲解“node中的fs模块、path模块怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node中的fs模块、path模块怎么用”吧!fs文件系...
    99+
    2024-04-02
  • 怎么用html5代码获取地理位置
    这篇文章主要介绍“怎么用html5代码获取地理位置”,在日常操作中,相信很多人在怎么用html5代码获取地理位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用html5...
    99+
    2024-04-02
  • Html5中怎么利用Geolocation获取地理位置信息
    这期内容当中小编将会给大家带来有关Html5中怎么利用Geolocation获取地理位置信息,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Html5中提供了地理位置信息的...
    99+
    2024-04-02
  • Nodejs中内置模块怎么使用
    小编给大家分享一下Nodejs中内置模块怎么使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内置模块的基本使用// 01. 导包const&...
    99+
    2023-06-14
  • Node.js中path模块,url模块,http模块怎么用
    小编给大家分享一下Node.js中path模块,url模块,http模块怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!path模块Node.js中,提供了一...
    99+
    2023-06-29
  • Node.js中怎么使用URL模块解析地址
    这篇文章给大家介绍Node.js中怎么使用URL模块解析地址,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。url结构化/模块化/路径解析结构化:url.parse(urlString[...
    99+
    2024-04-02
  • node中的path模块和fs模块怎么用
    本篇内容介绍了“node中的path模块和fs模块怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pa...
    99+
    2024-04-02
  • python中的sys模块和os模块怎么用
    今天小编给大家分享一下python中的sys模块和os模块怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.sys模块...
    99+
    2023-06-29
  • Python中的time模块和calendar模块怎么用
    这篇文章将为大家详细讲解有关Python中的time模块和calendar模块怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在Python中对时间和日期的处理方式有很多,其中转换日期是最常见的一个功...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作