iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis geohash 地理位置存储
  • 777
分享到

Redis geohash 地理位置存储

Redisgeohash地理位置存储 2021-12-28 08:12:48 777人浏览 无得
摘要

本文将对 Redis 的 GEO 特性进行介绍, 说明这个特性相关命令的用户, 并在最后说明如何使用这些命令去实现“查找附近的人”以及“摇一摇”这两个功能。   版本要求 因为 Redis 目前的稳定版本为 Redis 3.

Redis geohash 地理位置存储

本文将对 Redis 的 GEO 特性进行介绍, 说明这个特性相关命令的用户, 并在最后说明如何使用这些命令去实现“查找附近的人”以及“摇一摇”这两个功能。

 

版本要求

因为 Redis 目前的稳定版本为 Redis 3.0 , 而 GEO 特性是 Redis 3.2 版本的特性, 所以如果你想要使用这个特性的话, 那么就需要到 Redis 的 GitHub 页面去克隆 unstable 分支 然后编译 unstable 版本的 Redis 源码, 这样才能用到 Redis GEO 特性。

 

添加位置和获取位置

为了进行地理位置相关操作, 我们首先需要将具体的地理位置记录起来, 这一点可以通过执行 GEOADD 命令来完成, 该命令的基本格式如下:

1

GEOADD location-set longitude latitude name [longitude latitude name ...]

GEOADD 命令每次可以添加一个或多个经纬度地理位置。 其中 location-set 为储存地理位置的集合, 而 longitude 、 latitude 和 name 则分别为地理位置的经度、纬度、名字。

举个例子, 以下代码展示了如何通过 GEOADD 命令, 将清远、广州、佛山、东莞、深圳等数个广东省的市添加到位置集合 Guangdong-cities 里面:

1

2

3

4

5

redis> GEOADD Guangdong-cities 113.2099647 23.593675 Qingyuan

1 -- 成功添加一个位置

 

redis> GEOADD Guangdong-cities 113.2278442 23.1255978 Guangzhou 113.106308 23.0088312 Foshan 113.7943267 22.9761989 Dongguan 114.0538788 22.5551603 Shenzhen

4 -- 成功添加四个位置

在将位置记录到位置集合之后, 我们可以使用 GEOPOS 命令, 输入位置的名字并取得位置的具体经纬度:

1

GEOPOS location-set name [name ...]

比如说, 如果我们想要获取清远、广州和佛山的经纬度, 那么可以执行以下代码:

1

2

3

4

5

6

7

redis> GEOPOS Guangdong-cities Qingyuan Guangzhou Foshan

1) 1) "113.20996731519699" -- 清远的经度

2) "23.593675019671288" -- 清远的纬度

2) 1) "113.22784155607224" -- 广州的经度

2) "23.125598202060807" -- 广州的纬度

3) 1) "113.10631066560745" -- 佛山的经度

2) "23.008831202413539" -- 佛山的纬度

 

计算两个位置之间的距离

在拥有了地理数据之后, 我们就可以基于这些数据进行各种各样的操作。 针对地理位置信息的其中一个最简单的操作, 就是计算两个位置之间的距离。

在 Redis 里面, 计算两个位置之间的距离可以通过 GEODIST 命令来实现:

1

GEODIST location-set location-x location-y [unit]

在调用这个命令时, 用户需要给定想要计算差距的地点 location-x 和 location-y , 以及储存这两个地点的地理位置集合。

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

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

如果用户没有指定 unit 参数, 那么 GEODIST 默认使用米为单位。

作为例子, 以下代码展示了如何计算清远和广州之间的距离:

1

2

redis> GEODIST Guangdong-cities Qingyuan Guangzhou

"52094.433840356309" -- 两地相聚 52094

上面的计算结果使用了米来表示清远和广州两地的距离, 不过在表示比较长的距离时, 我们更习惯采用公里(km)作为单位。 通过显式地给定 km (千米)作为单位, 我们可以让 GEODIST 显示两个地点之间相距的公里数:

1

2

redis> GEODIST Guangdong-cities Qingyuan Guangzhou km

"52.094433840356309" -- 两地相聚 52 公里

 

获取指定范围内的元素

除了计算两地的距离之外, 另一个常见的地理位置操作就是找出特定范围之内的其他存在的地点。 比如找出地点 x 范围 100 米之内的所有地点, 找出地点 y 范围 50 公里之内的所有地点等等。

Redis 提供了 GEORADIUS 和 GEORADIUSBYMEMBER 两个命令来实现查找特定范围内地点的功能, 它们的作用一样, 只是指定中心点的方式不同: GEORADIUS 使用用户给定的经纬度作为计算范围时的中心点, 而 GEORADIUSBYMEMBER 则使用储存在位置集合里面的某个地点作为中心点。 以下是这两个命令的基本格式:

1

2

3

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]

这两个命令的各个参数的意义如下:

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

作为示例, 我们可以使用 GEORADIUSBYMEMBER 去找出位于广州 50 公里、 100 公里以及 150 公里以内的城市:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

redis> GEORADIUSBYMEMBER Guangdong-cities Guangzhou 50 km

1) "Foshan"

2) "Guangzhou"

 

redis> GEORADIUSBYMEMBER Guangdong-cities Guangzhou 100 km

1) "Foshan"

2) "Guangzhou"

3) "Dongguan"

4) "Qingyuan"

 

redis> GEORADIUSBYMEMBER Guangdong-cities Guangzhou 150 km

1) "Foshan"

2) "Guangzhou"

3) "Dongguan"

4) "Qingyuan"

5) "Shenzhen"

 

示例:查找附近的人

好的, 在了解了 Redis GEO 特性的基本信息之后, 接下来我们该思考如何使用这些特性去解决实际的问题了。

为了让用户可以方便地找到自己附近的其他用户, 每个社交网站基本上都内置了“查找附近的人”这一功能, 通过 Redis , 我们也可以实现同样的功能, 以下是实现该功能的伪代码:

1

2

3

4

5

6

7

8

9

10

11

def pin(user, longitude, latitude):

"""

记录用户的地理位置。

"""

GEOADD("user-location-set", longitude, latitude, user)

 

def find_nearby(user, n):

"""

返回指定用户附近 n 公里的所有其他用户。

"""

return GEORADIUSBYMEMBER("user-location-set", user, n, unit="km")

 

示例:摇一摇

为了增加乐趣性, 我们可以对“查找附近的人”这一功能进行修改 —— 程序不是返回指定范围内的所有人, 而是随机地返回指定范围内的某个人, 这也就是非常著名的“摇一摇”功能。 以下是实现该功能的伪代码:

1

2

3

4

5

6

7

8

9

RANDOM_RADIUS = 1 # 随机查找的范围为 1 公里

 

def find_random(user):

# 获取范围内的所有其他用户

get_all_near_users = find_nearby(user, RANDOM_RADIUS)

# 将查找的结果从 python 列表转换为 Python 集合

user_set = set(get_all_near_users)

# 然后调用 pop() 方法,从集合里面随机地移除并返回一个元素

return user_set.pop()

 

效率优化

现在的 find_random() 函数可以实现“摇一摇”功能, 但它的效率并不高: 因为程序每次执行这个函数的时候都需要重新执行 find_nearby() 函数以查找用户附近的位置, 然而大部分用户的位置并不经常改变, 并且 GEORADIUSBYMEMBER 命令的执行代价并不低, 因此每次执行 find_random() 都重新执行 find_nearby() 是一种非常低效的做法。

为了优化 find_random() 的效率, 我们可以为 find_random() 的结果创建缓存: 把每个执行“摇一摇”的用户的 find_nearby() 结果储存到一个 Redis 集合里面, 并设置一个过期时间(比如 5 分钟), 然后通过对集合使用 SRANDMEMBER 来随机地获取用户。 这样用户在指定过期时间内执行的所有“摇一摇”操作都只会引起一次 GEORADIUSBYMEMBER , 这将极大地提高 find_random() 的执行效率。

另外, 如果用户密集地聚集在一起, 那么通过使用 GEORADIUSBYMEMBER 命令提供的 COUNT 参数可以有效地减少指定范围内的用户数量, 这可以提高 find_nearby() 的效率, 从而提高 find_random() 的效率。

因为篇幅关系, 优化版的 find_random() 的具体实现这里就不给出了, 有兴趣的读者可以自己尝试完成这个函数。

 

结语

好的, 关于 Redis GEO 特性的简单介绍就到此结束, 希望这篇文章对于大家了解 Redis 的 GEO 特性能够有所帮助, 我也期待着大家能够和我分享其他 GEO 特性的用法。

您可能感兴趣的文档:

--结束END--

本文标题: Redis geohash 地理位置存储

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis之GEO存储地理位置信息的使用
    目录常用APIgeoaddgeoposgeodistgeoradiusbymembergeohash在外卖软件中的附近的美食店铺、外卖小哥的距离,打车软件附近的车辆,交友软件中附近的...
    99+
    2024-04-02
  • Redis的数据存储位置怎么查看
    要查看Redis的数据存储位置,可以通过查看Redis的配置文件来确定数据文件存储路径。以下是一种通用的方法: 连接到Redis...
    99+
    2024-03-11
    Redis
  • 本地存储VS云存储:区别不只是数据存放位置
      尽管云存储已经成熟,但企业IT部门仍然需要权衡本地存储和云存储的风险和好处,特别是在涉及到组织最关键的数据时。在许多企业看来,云存储是有利有弊的。  然而,数据量的爆发式增长,往往要求企业必须去使用云存储解决方案。而且,基于云的软件应用...
    99+
    2023-06-03
  • Docker配置本地镜像与容器的存储位置
    使用find命令找到大于指定大小的文件: find / -type f -size +10G 排除某个目录 find / -path "/media/xww" -type...
    99+
    2024-04-02
  • docker怎么设置存储位置
    在Docker中,可以通过两种方式来设置存储位置: 使用数据卷(Volumes):数据卷是一种特殊的目录,可以绕过容器文件系统的生...
    99+
    2024-03-01
    docker
  • Redis高效检索地理位置的原理解析
    Redis GEO 用做存储地理位置信息,并对存储的信息进行操作。通过geo相关的命令,可以很容易在redis中存储和使用经纬度坐标信息。Redis中提供的Geo命令有如下几个: ...
    99+
    2024-04-02
  • Redis中的GEO地理位置模块怎么用
    这篇文章主要介绍了Redis中的GEO地理位置模块怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GEO是 Redis 在3.2版本之后...
    99+
    2024-04-02
  • PHPcms栏目缓存存储位置详解
    PHPcms是一种流行的内容管理系统,用于快速搭建网站并管理网站内容。在PHPcms中,栏目缓存是一种重要的优化技术,可以加快网站的访问速度。本文将详细介绍PHPcms栏目缓存的存储位...
    99+
    2024-03-15
    缓存 php cms
  • win11如何更改储存位置
    这篇文章主要介绍“win11如何更改储存位置”,在日常操作中,相信很多人在win11如何更改储存位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”win11如何更改储存位置”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-02
  • win11怎么更改储存位置
    win11怎么更改储存位置?我们都知道电脑默认储存路径一般都在C盘,但是长期使用下来会给C盘的内存空间带来负担,进而影响电脑的运行,对此我们可以试试更改电脑默认储存路径,下面我们来看看这篇win11系统更换默认储存位置图文教程吧!win11...
    99+
    2023-07-10
  • PHPcms单页存储位置详解
    作为一种常用的内容管理系统,PHPcms在网站开发中发挥着重要作用。单页是其中的一个重要功能模块,通过单页可以展示特定内容或者功能,因此了解单页的存储位置是很有必要的。本文将详细解释P...
    99+
    2024-04-02
  • redis缓存存储Session原理机制
    目录基于 Redis 存储 Session首先安装 redis 存储引擎的包设置session过期时间分布式获取Session:(redis)基于 Redis 存储 Session ...
    99+
    2024-04-02
  • redis如何设置存储时间设置
    在Redis中,可以使用EXPIRE命令来设置键的过期时间。该命令接受两个参数,第一个参数为键名,第二个参数为过期时间,单位为秒。例...
    99+
    2023-09-11
    redis
  • windows7如何更改默认储存位置windows7更改默认储存位置操作流程
    windows7操作系统中客户下载文件得话是会默认储存到一个位置去,假如要想更改默认储存位置得话,需要怎么操作呢?你先点击菜单栏,寻找以个人帐户取名的文件夹名称,鼠标右键开启属性对话框,以后转换到位置菜单栏,点击挪动按键,在开启的渠道中挑选...
    99+
    2023-07-19
  • Centos7修改Docker默认存储位置
    Centos7安装docker之后,默认的镜像及容器存储路径为/var/lib/docker,可以使用命令docker info查看。但是该路径默认使用的是系统盘的存储,如果挂载了数据盘,需要把docker的默认存储路径修改至数据盘的挂载目...
    99+
    2023-01-31
    位置 Docker
  • rabbitmq数据存储的位置在哪
    RabbitMQ的数据存储位置取决于您的操作系统和安装方式。一般情况下,RabbitMQ的数据存储在以下位置: Windows: ...
    99+
    2023-10-23
    rabbitmq
  • 如何利用Redis实现分布式地理位置查询
    如何利用Redis实现分布式地理位置查询地理位置查询在我们日常生活中随处可见,比如找附近的餐馆、定位快递包裹等。在传统的关系型数据库中,实现地理位置查询需要进行复杂的空间索引和距离计算,对于大规模的数据量来说效率较低。而Redis作为一种高...
    99+
    2023-11-07
    Redis分布式地理位置查询
  • C++虚函数表存储位置在哪
    这篇文章主要介绍“C++虚函数表存储位置在哪”,在日常操作中,相信很多人在C++虚函数表存储位置在哪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++虚函数表存储位置在哪”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • 详解C++虚函数表存储位置
    目录前言反汇编相近地址前言 先说结论:虚函数表存储在只读数据段(.rodata)、虚函数存储在代码段(.text)、虚表指针的存储的位置与对象存储的位置相同,可能在栈、也可能在堆或数...
    99+
    2023-05-14
    C++虚函数表存储位置 C++虚函数表存储 C++虚函数表
  • PHPcms单页信息存储位置揭秘
    PHPcms单页信息存储位置揭秘 近年来,随着网络技术的飞速发展,网站建设已成为各行各业宣传推广的首选方式之一。而在网站建设中,使用PHPcms系统是非常常见的选择之一。作为一款功能强...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作