我的一个Rails初始化程序配置/初始化程序/ globals.rb中有一个全局变量。这个变量只是一个列表,设置为Redis集的成员。
$listOfBannedDomains = $redis.smembers("banned_domains")
Redis设置会在一段时间内更新一次。如何在每次X小时内使用Redis设置的内容更新$ listOfBannedDomains而不重新启动我的Rails应用程序?
请注意,我不想实时读取Redis设置。
答案 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更新值。