每隔X分钟使用API​​刷新数据

时间:2015-04-16 22:18:44

标签: ruby-on-rails ruby

Ruby on Rails 4.1.4

我创建了一个Twitch gem的接口,用于获取当前流的信息,主要是它是否在线,还有当前标题和正在播放的游戏。

由于网站流量很大,每次用户进入时我都无法发出请求,因此我需要缓存此信息。

缓存信息存储为类变量@@ stream_data in class:Twitcher。

我已经使用cronjobs进行了rake任务更新,调用了Twitcher.refresh_stream,但当然不会在我的活动进程中运行(每个访问者都连接到这个进程),而是一个单独的进程。所以实际应用上的@@ stream_data总是空的。

有没有办法在我当前运行的rails应用程序中每隔X分钟运行一次代码?或者更好的方法,就此而言。

感谢您的时间!

3 个答案:

答案 0 :(得分:1)

这听起来像是一个很好的缓存呼叫

Rails.cache.fetch("stream_data", expires_in: 5.minutes) do
  fetch_new_data
end

如果数据在缓存中并且不是旧的那么它将在不执行块的情况下返回,否则该块用于填充缓存。

默认缓存存储只是将内容保存在内存中,因此无法解决您的问题:您需要选择在您的进程中共享的缓存存储。 redis和memcached(通过dalli gem)都是受欢迎的选择。

答案 1 :(得分:0)

查看Whenever(基本上是cron的ruby界面)以定期调用某些内容。

答案 2 :(得分:0)

我使用谷歌分析时遇到了类似的问题。 Google分析要求您为每个请求提供API密钥。但是api密钥每小时都会到期。如果您为每个Google Analytics分析请求申请了新的API密钥,则每个请求的速度都会非常慢。

所以我做的是制作另一个类变量@@expires_at。现在,在提出谷歌分析请求的每种方法中,我都会检查@@expires_at.past?。如果是真的,那么我会刷新api密钥并设置@@expires_at = 45.minutes.from_now

你可以这样做。

def method_that_needs_stream_data
  renew_data if @@expires_at.past?
  # use @@stream_data
end

def renew_data
  # renew @@stream_data here
  @@expires_at = 5.minutes.from_now
end

告诉我它是怎么回事。