Ruby on Rails 4.1.4
我创建了一个Twitch gem的接口,用于获取当前流的信息,主要是它是否在线,还有当前标题和正在播放的游戏。
由于网站流量很大,每次用户进入时我都无法发出请求,因此我需要缓存此信息。
缓存信息存储为类变量@@ stream_data in class:Twitcher。
我已经使用cronjobs进行了rake任务更新,调用了Twitcher.refresh_stream,但当然不会在我的活动进程中运行(每个访问者都连接到这个进程),而是一个单独的进程。所以实际应用上的@@ stream_data总是空的。
有没有办法在我当前运行的rails应用程序中每隔X分钟运行一次代码?或者更好的方法,就此而言。
感谢您的时间!
答案 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
告诉我它是怎么回事。