位置请求的缓存策略

时间:2014-06-01 16:42:19

标签: rest caching geolocation location http-caching

我正在构建REST API,在特定区域返回数据(比如说事件)。 REST URL是一个简单的GET

/api/v1/events?lat=<lat>&lng=<lng>&radius=<radius>.

参数latlngradius(默认为10英里),纬度和经度是设备或浏览器API返回的内容。现在不用说,lat和lng随着用户移动而连续变化,并且两个用户可以是相同的附近,具有不同的lat / lng。在服务器上 缓存 这类请求的最佳方式是什么,这样我就不必每次都进入业务逻辑。自lat / lng更改后,URL不会是唯一的。

由于

3 个答案:

答案 0 :(得分:2)

我认为最好的方法是将结果存储在以中心坐标为键的缓存中,然后查询圆圈内的点以获取新请求。

我不知道任何允许你执行空间查询的缓存引擎,所以我认为你必须使用一个允许轻松查询和索引空间数据的数据库。您可以使用该数据库来缓存结果,或者至少将该结果的密钥存储在其他地方的缓存引擎中,稍后您可以使用空间坐标查询它们,并要求所有与您的新请求具有阈值距离的点。 / p>

PostgreSQL有PostGis,因为它完全支持纬度/经度距离计算,所以应该非常简单。一旦你使用适当的索引进行设置,它应该像以下一样简单:

SELECT * FROM your_cache_table 
WHERE ST_Distance_Sphere(the_geom, ST_MakePoint(new_lon, new_lat)) <= 160.934

MySQL对OpenGis扩展有一些支持,但它不支持纬度/经度距离计算。也许你需要自己做一些计算,也许简单的笛卡尔距离适合你。查看文档herethis answer也应该提供帮助。

我也相信即使MySQL 5.6仍然只支持MyISAM表中的空间索引,但这不应该是一个问题,因为你只将它们用于缓存。

管理缓存可能比平时稍微复杂一些。如果需要过期,则应该只在数据库中存储密钥,并在缓存服务器上设置expire参数。当您点击不再有效密钥的数据库点时,您将从数据库中清除它。当主数据发生更改时,您可能需要一种方法来使缓存无效,从数据库和缓存服务器中删除。

答案 1 :(得分:2)

我假设您有某种“网格”,当用户请求特定坐标时,您将返回该位置周围的网格图块。所以你有一个无限的URL空间(坐标),它被映射到有限数量的tile。一种解决方案是将每个请求重定向到该磁贴的“规范”缓存友好URL,例如

GET /api/v1/events?lat=123&lng=456
=>
302 Found
Location: /api/v1/events?tile=abc

或者,如果您想在网址中保留纬度/经度信息,则可以使用拼贴中心的位置。

答案 2 :(得分:-1)

我一直在为一个业余爱好应用程序建模数据,这个应用程序也需要处理地理定位数据,并且不得不尝试解决类似的问题。解决方案当然取决于您拥有的约束以及对您的应用程序目的至关重要的实际用例。我将假设您具有设计灵活性,可以更改应用程序的所有方面。即技术堆栈。

注意:

  

...所以我不必每次都考虑业务逻辑。 URL不是   从lat / lng变化开始变得独特。

以上是一个含糊不清的陈述,因为不涉及业务逻辑可能意味着许多事情。我将假设它意味着您不希望进行任何数据库查询以检索可能与您在缓存中已有的数据类似的新数据。假设您只想在服务器上缓存,我们会想到以下方法:

  1. 在数据库和应用程序之间缓存数据。

    数据库---&gt;缓存 - &gt; App ---&gt;用户

  2. 在这种方法中,您的应用程序处理所有其余的api调用,然后决定是否可以使用缓存中的结果或是否需要其他数据库访问。

    1. 在应用程序和用户之间缓存数据。

      数据库 - &gt; App ---&gt;缓存---&gt;用户

    2. 考虑到网址总是在变化,这种方法有点棘手。因此,您可能需要一个“智能缓存机制”来处理传入的URL,然后确定缓存的数据是否相关。智能缓存可以通过多种方式完成,具体取决于应用程序的实现方式。像mongodb这样的东西可以用作json缓存,然后可以预处理每个传入的请求,以查看数据是否只能从此缓存返回或重定向到主应用程序。所以结构可能如下所示:

      数据库 - &gt; App ---&gt; (一些逻辑(例如NodeJS app)+ Mongodb)---&gt;用户

      结论:

      如果不了解解决方案的体系结构,关键用例和完整的设计约束,就无法真正建议完全解决此问题。您可能需要重新考虑您尝试提供的某些功能,并做出艰难的妥协以使工作正常进行。希望不同的人在这里提出的建议会有所帮助。