Ruby on rails 如何在某种作业中更新全局Rails变量?
我的Rails初始化器config/initializers/globals.rb中有一个全局变量。此变量只是一个列表,设置为Redis集合的成员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集合。您可以创建一个包装器方法来返回此变量。
$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停止。