加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2018-11-15 18:24:37 所属栏目:编程 来源: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

(编辑:河北网)

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

热点阅读