为 search/repositories 缓存 Github API 响应
Cache the Github API response for search/repositories
我想在 rails 中编写一个网络应用程序来搜索 Github 存储库。由于查询 Github API 存在限制,我认为缓存响应是个好主意。
此端点 search/repositories?q=search_term
returns 以分页格式显示结果。所以,我不确定在这种情况下如何进行缓存?
有很多方法可以在缓存中连接分页,但所有方法都需要对分页中的每个页面发出新请求。
因此,让用户的直觉占主导地位。如果用户需要下一页,请为他们提供单击 "next page" 的选项,并让他们遵循 Github 提供的 link header。那在您的缓存中看起来如何?既然他们在 URL 的末尾提供了一个方便的 page=2
参数,为什么不直接使用用户请求的 URL 作为键,值是响应。
url = "api.github.com/search/resource?q=name:cool+name"
if(get(url)) return get(url)
response = get(url)
set(url, response)
return response
如果用户点击 "next page",您应该发出此请求:
url = "api.github.com/search/resource?q=name:cool+name&page=2"
if(get(url)) return get(url)
response = get(url)
set(url, response)
return response
但是看看流程怎么没变?如果它在缓存中,请发送它。如果不是,请不要。
为什么我们不想递归缓存所有页面?因为人类最清楚。计算机很乐意为每次搜索缓存 1,000,000 个响应。但是,如果 99.99% 的人只是在寻找首页的响应呢?为什么要浪费所有 space?因此,通过分页,让人们选择是否需要更多数据总是最容易的。不要尝试 pre-cache 可能永远不会使用的数据。
我想在 rails 中编写一个网络应用程序来搜索 Github 存储库。由于查询 Github API 存在限制,我认为缓存响应是个好主意。
此端点 search/repositories?q=search_term
returns 以分页格式显示结果。所以,我不确定在这种情况下如何进行缓存?
有很多方法可以在缓存中连接分页,但所有方法都需要对分页中的每个页面发出新请求。
因此,让用户的直觉占主导地位。如果用户需要下一页,请为他们提供单击 "next page" 的选项,并让他们遵循 Github 提供的 link header。那在您的缓存中看起来如何?既然他们在 URL 的末尾提供了一个方便的 page=2
参数,为什么不直接使用用户请求的 URL 作为键,值是响应。
url = "api.github.com/search/resource?q=name:cool+name"
if(get(url)) return get(url)
response = get(url)
set(url, response)
return response
如果用户点击 "next page",您应该发出此请求:
url = "api.github.com/search/resource?q=name:cool+name&page=2"
if(get(url)) return get(url)
response = get(url)
set(url, response)
return response
但是看看流程怎么没变?如果它在缓存中,请发送它。如果不是,请不要。
为什么我们不想递归缓存所有页面?因为人类最清楚。计算机很乐意为每次搜索缓存 1,000,000 个响应。但是,如果 99.99% 的人只是在寻找首页的响应呢?为什么要浪费所有 space?因此,通过分页,让人们选择是否需要更多数据总是最容易的。不要尝试 pre-cache 可能永远不会使用的数据。