在 Amazon ElastiCache for Redis 中处理地理空间数据 数据库博客
在 Amazon ElastiCache for Redis 中处理地理空间数据
主要重点
在这篇文章中,我们将介绍如何使用 Amazon ElastiCache for Redis 来简化地理空间数据处理,通过一个打车应用的案例,展示其在性能、可扩展性及简易性方面的优势。
地理空间数据应用无处不在,例如地图、气象和手机追踪软件等,这篇文章将展示如何利用 ElastiCache for Redis 进行地理空间数据的高效处理。
ElastiCache for Redis 的优势
在这个使用案例中,ElastiCache for Redis 是处理地理空间数据的理想工具,原因如下:
优势描述速度提供微秒级延迟数据存储在内存中临时数据车辆是不断移动的托管服务ElastiCache 是一个完全托管的服务,可以在几分钟内配置新集群高可用性提供自动故障转移和多可用区部署的恢复以及持续监控可扩展性ElastiCache for Redis 提供自动扩展,对于多位乘客需要叫车的性能至关重要成本无前期成本或长期承诺简易性内置的地理空间功能让您能够迅速达到想要的结果与 AWS 的集成例如,您可以使用 Amazon Location Service 进行可视化表示本地写入、全球读取通过 Global Datastore,您可以使数据更接近用户,并启用跨区域的灾难恢复尽管有多种服务可以处理地理空间数据,但 ElastiCache for Redis 的特性,如微秒延迟、多可用区和一键扩展,正是此使用案例所需的理想选择。此外,通过以集群模式部署 ElastiCache for Redis,您可以实现数据在多个实例之间的分片,这为应用程序提供多个写入点,以支持对地理空间数据的大量更新。
解决方案概述
在这个使用案例中,我们将演示如何使用 ElastiCache for Redis 简化存储车辆信息和搜索可用车辆的复杂任务。当乘客叫车时,根据他们当前的位置,可以快速匹配到相应范围内可用的车辆。
以下图表显示了 ElastiCache 的数据流入和流出:
数据流的步骤包括:
车辆发送它们的位置和可用性。乘客叫车。Redis 使用其内置功能识别附近的可用车辆。API 调用通知乘客和司机。API 调用更新数据,通知车辆可以接受下一次搭乘。前提条件
这个示例需要最新版本的 ElastiCache for Redis,并且集群应该已经启动。在这篇文章中,我们使用的是 ElastiCache for Redis 707。
需要最新版本的 Redis 客户端以从 Amazon Elastic Compute Cloud Amazon EC2进行命令行访问。详细的设置说明请参考授予对您的集群的访问权限。
最新版本的 Redis Python 库是执行 Python 代码所需的,可以通过 AWS Lambda 函数或集成开发环境 (IDE) 运行。要了解如何让 Lambda 函数访问 ElastiCache 集群,请参考教程:配置 Lambda 函数以访问 Amazon ElastiCache 在 Amazon VPC 中的教程。
初始化和列出键
初始化并列出 ElastiCache for Redis 集群中的任何键,确保 Redis 客户端中没有数据。在 Redis 客户端中运行以下命令:
bash rediscli h p 6379
keys (empty array)
配置、查询和移除地理空间数据
在本节中,我们将示范 API 调用和命令,以配置、查询和移除地理空间数据。我们提供了相同的代码,既可以用于 Python API 调用,也可以用于命令行的互动命令。
首先,我们设置地理空间数据。可供乘客使用的车辆会使用 GEOADD 添加到地理空间哈希表 “NYCCABS” 中。以下是 Python 代码:pythonimport redis
r = redisRedis( host= port= 6379)
CabList = [ (40732028961181647398812866210938id3004672) (40679992675781257396420288085938id3505355) (4073758316040039739974365234375id1217141) (40771900177001957395606994628906id2150126) (407614746093757397021484375id1598245)]
for coords in CabList rgeoadd(NYCCABS coords)
使用 Redis 客户端执行以下代码:
bash
GEOADD NYCCABS 4073202896118164 7398812866210938 id3004672 4067999267578125 7396420288085938 id3505355 4073758316040039 739974365234375 id1217141 4077190017700195 7395606994628906 id2150126 40761474609375 7397021484375 id1598245(integer) 5
列出已添加且可用的车辆,使用 GEOHASH。以下是 Python 代码:pythonimport redis
r = redisRedis( host= port= 6379)
rgeohash(NYCCABS id3004672 id3505355 id1217141 id2150126 id1598245)
我们会得到以下输出:
plaintext[hfugnfu5vj0 hfugjxnr290 hfugp10jwq0 hfugrb9nwj0 hfugpw1s700]
使用 Redis 客户端执行以下代码:
bash
GEOHASH NYCCABS id3004672 id3505355 id1217141 id2150126 id15982451) hfugnfu5vj02) hfugjxnr2903) hfugp10jwq04) hfugrb9nwj05) hfugpw1s700
当乘客叫车时,会调用 Lambda 函数。此时,乘客位于 130 E 12th St New York NY 10003,坐标为 40732 739881。
以下是 Python 代码:
pythonpickuplatitude pickuplongitude = 40732 739881
使用 GEOSEARCH,您可以快速找到指定半径内的车辆。在以下代码块中,我们搜寻 1 英里半径内的车辆。以下是 Python 代码:pythonridelist = rgeosearch(name=NYCCABS longitude=40732 latitude=739881 radius=1 unit=mi sort=ASC)print(ridelist)
我们将获得以下按距离升序排列的输出:
plaintext[id3004672 id1217141]
使用 Redis 客户端执行以下代码:

bashGEOSEARCH NYCCABS FROMLONLAT 40732 739881 BYRADIUS 1 mi ASC1) id30046722) id1217141
一元机场.cn官网下载在以下代码块中,我们获取与该车辆相关的数据,比如从乘客的距离及其坐标。以下是 Python 代码:pythonridelist = rgeosearch(name=NYCCABS longitude=40732 latitude=739881 radius=1 unit=mi sort=ASC)
for ride in ridelist print(ride)
我们将会得到以下输出:
plaintext[id3004672 00021 (40732028782367706 7398812916556949)][id1217141 0654 (40737580955028534 739974366616666)]
使用 Redis 客户端执行以下代码:
bashGEOSEARCH NYCCABS FROMLONLAT 40732 739881 BYRADIUS 1 mi ASC WITHDIST WITHCOORD1) id30046722) 000213) 1) 407320287823677063 2) 73988129165569489492) id12171412) 065403) 1) 4073758095502853394 2) 739974366616665975
我们选择最近的车辆 ID id3004672 进行这次搭载。该车辆当前位于 86 3rd Ave New York NY 10003,坐标为 4073203 73988129。通知乘客和司机有匹配和确认。经过确认后,使用 ZREM 将该车辆从可用列表中移除。以下是 Python 代码:pythonrzrem(NYCCABS id3004672)
我们将得到以下输出:
plaintext1
使用 Redis 客户端执行以下代码:
bash
ZREM NYCCABS id3004672(integer) 1
为了确认,可以检查该车辆在哈希表中的存在。以下是 Python 代码:pythonrgeohash(NYCCABS id3004672)
我们将得到以下输出:
plaintext[None]
使用 Redis 客户端执行以下代码:
bash
GEOHASH NYCCABS id30046721) (nil)
通过这几个简单的命令,ElastiCache for Redis 可以迅速处理地理空间数据。
清理
为了避免不必要的费用,请执行以下步骤来清理您的资源:
删除 ElastiCache for Redis 集群。删除任何用于模拟打车用例的 Lambda 函数或其他资源。删除您所创建的测试解决方案所需的任何 EC2 实例。总结
在这篇文章中,我们展示了如何使用少量简单的命令在 ElastiCache for Redis 中快速存储和匹配乘客与车辆。除了性能和成本优势外,这种易用性将促进更复杂的地理空间用例的创新。
如需了解有关 ElastiCache for Redis 及其他地理空间用例的更多信息,请参考以下资源:
设置一个可扩展且高可用的 Redis 集群为您的在线应用构建快速会话存储地理空间公共自行车 GitHub 仓库关于作者
Venkataramanan Govindarajan 是 Amazon Web Services 的高级数据库解决方案架构师。Venkat 与客户合作,提供架构指导和数据库解决方案,帮助他们利用 AWS 服务创新并提升业务价值。
使用 AWS Lambda 运行时 API 代理扩展增强运行时安全性和治理 计算博客
强化 AWS Lambda 运行时安全性与治理的代理扩展重点摘要本文介绍了如何通过 AWS Lambda 运行时 API 代理模式来提高 Lambda 函数的安全性与治理。此方法让安全供应商和工程团队能够无侵入地提供增强的工具,能够在不改变函数代码的情况下拦截传入事件和传出响应。这一方法的应用场景包...