加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

使用Redis和Python构建一个共享单车的应用程序

发布时间:2018-11-17 11:49:31 所属栏目:MySql教程 来源:Tague Griffith
导读:学习如何使用 Redis 和 Python 构建一个位置感知的应用程序。 我经常出差。但不是一个汽车狂热分子,所以当我有空闲时,我更喜欢在城市中散步或者骑单车。我参观过的许多城市都有共享单车系统,你可以租个单车用几个小时。大多数系统都有一个应用程序来帮

代码首先加载所有需要系统在内存中处理的共享单车站的信息数据集。 当加载了一个车站的信息时,该站就会按照 Redis 键名从内存中的车站集合中删除。 加载完所有车站数据后,我们就剩下一个包含该系统所有必须删除的车站数据的集合。

程序迭代处理该数据集,并创建一个事务删除车站的信息,从地理空间索引中删除该车站的键名,并从系统的车站列表中删除该车站。

代码重点

在示例代码中有一些值得注意的地方。 首先,使用 GEOADD 命令将所有数据项添加到地理空间索引中,而使用 ZREM 命令将其删除。 由于地理空间类型的底层实现使用了有序集合,因此需要使用 ZREM 删除数据项。 需要注意的是:为简单起见,示例代码演示了如何在单个 Redis 节点工作; 为了在集群环境中运行,需要重新构建事务块。

如果你使用的是 Redis 4.0(或更高版本),则可以在代码中使用 DELETEHMSET 命令。 Redis 4.0 提供 UNLINK 命令作为 DELETE 命令的异步版本的替代。 UNLINK 命令将从键空间中删除键,但它会在另外的线程中回收内存。 在 Redis 4.0 中 HMSET 命令已经被弃用了而且 HSET 命令现在接收可变参数(即,它接受的参数个数不定)。

通知客户端

处理结束时,会向依赖我们数据的客户端发送通知。 使用 Redis 发布/订阅机制,通知将通过 geobike:station_changed 通道和系统 ID 一起发出。

数据模型

在 Redis 中构建数据时,最重要的考虑因素是如何查询信息。 共享单车程序需要支持的两个主要查询是:

  • 找到我们附近的车站
  • 显示车站相关的信息

Redis 提供了两种主要数据类型用于存储数据:哈希和有序集。 哈希类型很好地映射到表示车站的 JSON 对象;由于 Redis 哈希不使用固定的数据结构,因此它们可用于存储可变的车站信息。

当然,在地理位置上寻找站点需要地理空间索引来搜索相对于某些坐标的站点。 Redis 提供了几个使用有序集数据结构构建地理空间索引的命令。

我们使用 ${system_id}:station:${station_id} 这种格式的键名存储车站相关的信息,使用 ${system_id}:stations:location 这种格式的键名查找车站的地理空间索引。

获取用户位置

构建应用程序的下一步是确定用户的当前位置。 大多数应用程序通过操作系统提供的内置服务来实现此目的。 操作系统可以基于设备内置的 GPS 硬件为应用程序提供定位,或者从设备的可用 WiFi 网络提供近似的定位。

查找车站

找到用户的位置后,下一步是找到附近的共享单车站。 Redis 的地理空间功能可以返回用户当前坐标在给定距离内的所有车站信息。 以下是使用 Redis 命令行界面的示例。

使用Redis和Python构建一个共享单车的应用程序

想象一下,我正在纽约市第五大道的苹果零售店,我想要向市中心方向前往位于西 37 街的 MOOD 布料店,与我的好友 Swatch 相遇。 我可以坐出租车或地铁,但我更喜欢骑单车。 附近有没有我可以使用的单车共享站呢?

苹果零售店位于 40.76384,-73.97297。 根据地图显示,在零售店 500 英尺半径范围内(地图上方的蓝色)有两个单车站,分别是陆军广场中央公园南单车站和东 58 街麦迪逊单车站。

我可以使用 Redis 的 GEORADIUS 命令查询 500 英尺半径范围内的车站的 NYC 系统索引:

  1. 127.0.0.1:6379> GEORADIUS NYC:stations:location -73.97297 40.76384 500 ft
  2. 1) "NYC:station:3457"
  3. 2) "NYC:station:281"

Redis 使用地理空间索引中的元素作为特定车站的元数据的键名,,返回在该半径内找到的两个共享单车站。 下一步是查找两个站的名称:

  1. 127.0.0.1:6379> hget NYC:station:281 name
  2. "Grand Army Plaza & Central Park S"
  3.  
  4. 127.0.0.1:6379> hget NYC:station:3457 name
  5. "E 58 St & Madison Ave"

这些键名对应于上面地图上标识的车站。 如果需要,可以在 GEORADIUS 命令中添加更多标志来获取元素列表,每个元素的坐标以及它们与当前点的距离:

  1. 127.0.0.1:6379> GEORADIUS NYC:stations:location -73.97297 40.76384 500 ft WITHDIST WITHCOORD ASC
  2. 1) 1) "NYC:station:281"
  3. 2) "289.1995"
  4. 3) 1) "-73.97371262311935425"
  5. 2) "40.76439830559216659"
  6. 2) 1) "NYC:station:3457"
  7. 2) "383.1782"
  8. 3) 1) "-73.97209256887435913"
  9. 2) "40.76302702144496237"

查找与这些键名关联的名称会生成一个我可以从中选择的车站的有序列表。 Redis 不提供方向和路线的功能,因此我使用设备操作系统的路线功能绘制从当前位置到所选单车站的路线。

GEORADIUS 函数可以很轻松的在你喜欢的开发框架的 API 里实现,这样就可以向应用程序添加位置功能了。

其他的查询命令

除了 GEORADIUS 命令外,Redis 还提供了另外三个用于查询索引数据的命令:GEOPOSGEODISTGEORADIUSBYMEMBER

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!