我有一个从天气API获取的服务,它只允许我每天调用它500次,因为我找不到任何有小时数据的好的免费天气API。该服务调用api,该api在用户每次点击页面时返回一个JSON数组。
由于我是目前唯一一个使用该服务的人,这不是问题,但为了将来,我希望缓存搜索结果,并在一两个小时后过期,因为数据变化非常频繁。
所以,若用户键入他们的zip,结果将被缓存2个小时。如果他们按下刷新,它将从缓存中提取保存的数据,或者如果另一个用户进来并键入它将从高速缓存中提取的相同zip。
减少API请求总量的最佳方法是什么?我曾考虑过使用SQL,但它似乎不太适合,因为数据在某种程度上是动态的,而且在50000多个zip中有很多不同的可能性。
为什么不使用SQL数据库?
这看起来相当直截了当。需要记住的一件事是,在每个API调用上捕获尽可能多的信息。如果API允许您一次获取不止一条信息,请尽可能多地获取,这样您就不必返回API。
注意:此解决方案无法解决您只能访问API 500次的问题。它将为您提供一种方法,使您不必在每个邮政编码中多次返回API。
- 记下邮编
- 检查您的数据库,看看您是否已经存储了该zip(如果存储了,请检查时间戳,看看是否要转到API获取新信息)
- 如果它不在您的数据库中,请放置API调用,并使用Zip作为识别数据将返回的信息存储在数据库中
首先,我要准备一个包含以下字段的表:request_sig
、response_data
、timestamp
。
以下是我要遵循的"算法":
- 用户请求天气信息
- 取API调用参数"giveMeWeather.com
/zip/10001
"并进行哈希 - 检查数据库中的散列(
sig
),如果我找到匹配=>则返回response_data
- 如果找不到匹配,请调用API并将响应存储在数据库中,然后将响应提供给clinet
- 让
cronjob
清洁表格并删除旧条目(检查timestamp
中的旧条目)
这并不能解决500个呼叫的限制,但这是一个很难解决的问题。
有很多可用的缓存系统。您可以指定数据缓存的时间,也可以为保存的数据的每个部分指定自己的密钥。有些是memcached、APC和XCache。我不确定他们是否使用数据库、文件或缓存什么。