如何在某种工作中更新全局Rails变量?

时间:2016-08-25 20:43:55

标签: ruby-on-rails ruby

我的一个Rails初始化程序配置/初始化程序/ globals.rb中有一个全局变量。这个变量只是一个列表,设置为Redis集的成员。

$listOfBannedDomains = $redis.smembers("banned_domains")

Redis设置会在一段时间内更新一次。如何在每次X小时内使用Redis设置的内容更新$ listOfBannedDomains而不重新启动我的Rails应用程序?

请注意,我不想实时读取Redis设置。

2 个答案:

答案 0 :(得分:2)

您可以使用EventMachine进行此操作并利用它perioidic timer在异步循环中异步执行此操作。

创建新的rails初始化程序 - config/initializers/redis_periodic.rb

$listOfBannedDomains = $redis.smembers("banned_domains")

Thread.new { EM.run } unless EM.reactor_running? # Run the EventMachine reactor if it's not running already in a new thread.
Signal.trap("INT")  { EM.stop }
Signal.trap("TERM") { EM.stop }

# Add a periodic timer:
time_interval = 5 #seconds
EM.add_perioidic_timer(time_interval) do
  # Update the constant by re-reading from redis
  $listOfBannedDomains = $redis.smembers("banned_domains")
end

注意:这不会阻止您的主Rails线程发出请求,并允许您按照rails实例异步执行该操作。您可以在初始化程序中添加额外条件,以在Rake中排除这种情况(如果需要)。

答案 1 :(得分:1)

您可以创建一个包装器方法来返回此变量。您可以添加一些额外的变量来存储上次更新的时间。如果上次更新的时间超过X小时,则从Redis更新值。