Ruby on rails 如何在某种作业中更新全局Rails变量?

Ruby on rails 如何在某种作业中更新全局Rails变量?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的Rails初始化器config/initializers/globals.rb中有一个全局变量。此变量只是一个列表,设置为Redis集合的成员 $listOfBannedDomains = $redis.smembers("banned_domains") Redis集每隔一段时间就会更新一次。在不重新启动Rails应用程序的情况下,如何每X小时用Redis集合中的内容更新$listOfBannedDomains 请注意,我不想实时读取Redis集合。您可以创建一个包装器方法来返回此变量。

我的Rails初始化器config/initializers/globals.rb中有一个全局变量。此变量只是一个列表,设置为Redis集合的成员

$listOfBannedDomains = $redis.smembers("banned_domains")
Redis集每隔一段时间就会更新一次。在不重新启动Rails应用程序的情况下,如何每X小时用Redis集合中的内容更新$listOfBannedDomains


请注意,我不想实时读取Redis集合。

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

您可以使用它,并利用它在事件循环中异步执行该操作

创建新的rails初始值设定项-
config/initializers/redis\u 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中发生这种情况(如果需要).

我很好奇为什么每次访问$listOfBannedDomains时你都不想从redis中读取?因为它可能包含10亿项。下面添加了一个答案,让你的常量可以在不阻塞Rails的情况下异步更新。我想如果Rails线程退出,这个EM线程将停止运行?很好。错过了。添加了相同的代码。建议的方法是捕获信号,并在主线程退出时要求EM停止。