【问题标题】:Store and retrieve data from coordinates in Redis从 Redis 中的坐标存储和检索数据
【发布时间】:2017-11-28 21:46:26
【问题描述】:

我使用 Redis 作为缓存系统来存储数据,以避免对 API 的不必要消耗。我在想的是在从 API 获取结果之后,将坐标(例如,作为键)和数据存储在 Redis 上,并在以后的搜索中再次使用外部 api,如果在 Redis 中通过新的坐标检查与保存的坐标相匹配(以米为单位),如果匹配,请将存储的数据带给我。

我已经搜索了至少 1 小时,但找不到任何符合我需要的相关结果。例如,GEOADD 无法帮助我,因为它不会被 Redis 自动过期。

唯一的解决方案是将坐标存储为带有 json 值的键(例如:-51.356156,-50.356945),并通过函数式编程检查所有键(坐标)是否匹配另一个坐标。但它看起来不够优雅,性能也很差。

有什么想法吗?

我在 NodeJS (Express) 中使用 Redis。

【问题讨论】:

  • 您要添加过期时间或比较坐标?
  • 我需要比较坐标,如果它适合距离(例如100m),则获取缓存在Redis上的键/值。

标签: node.js express redis coordinates


【解决方案1】:

如果我理解正确,您希望能够:

  1. 缓存 API 对给定坐标元组的响应
  2. 能够对缓存的响应执行有效的半径搜索
  3. 使用 Redis 的过期时间使旧的缓存条目失效

为了满足 #1,您已经概述了正确的方法 - 将每个 API 调用存储在自己的密钥下。您可以通过坐标命名键,或使用它们的 geohash 值(可以在客户端或 Redis 中的临时元素计算它)。也不要忘记在该键上设置一个 TTL 和全局 maxmemory eviction 策略以使 eviction 真正起作用。

第二个要求要求使用地理集。将坐标和键名存储在其中。通过调用GEORADIUS 执行查询,然后根据回复获取相关密钥。

在从 #2 的查询中获取键时,您可能会发现其中一些已从键空间中逐出,但不在 Geo Set 中。为这些中的每一个调用ZREM,以保持索引(地理集)和键空间之间的同步。此外,您还可以运行 ZSCAN 的 Geo Set 并执行内务管理的定期后台任务。这应该照顾#3。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多