我正在尝试为RoR应用程序创建一个简单的设置对象。我只想要一个对象类的实例,我希望它能够读/写一个redis数据库。最重要的是,它应该始终与数据库保持同步。由于这个应用程序在heroku上的web dynos上运行,我担心每个dyno都会包含它自己的对象副本,所以我添加了一个redis pubsub设置来通知所有实例db已更新并重新加载数据。这一切似乎都很好 - 保存数据,所有实例都获取消息并自行更新等等。
但是,在将数据加载到视图中时,我有时会看到过时的数据,而我无法确定这些数据的来源。
显示问题的步骤:
#value-updated: OK
我已经通过验证控制器是否正在从某个地方生活的不同步对象加载陈旧数据来检查该视图是否存在缓存问题。此外,无论有多少次更新数据,都只有一个不同步的对象,并且它始终显示应用程序最初启动时数据库中的数据。
以下是我正在使用的代码的简化版本。来自铁路大师的任何指针都将非常感激。谢谢!
P.S。 - 我似乎无法在本地复制这个。只有当我推到我的一个heroku环境时才会发生这种情况。
MyObject类:
class MyObject
def self.instance_of
@object ||= new
end
def initialize
refresh
end
def my_value=(value)
@my_value = value
end
def my_value
@my_value
end
def save
response = $redis.set("my_value", @my_value)
$redis.publish "value-updated", response
end
def refresh
@my_value = $redis.get("my_value")
end
end
初始化程序中的子侦听器:
Thread.new
$redis.subscribe("value-updated") do |on|
on.message do |channel, msg|
puts "##{channel} : #{msg]}"
end
end
end
在控制器中:
@my_value = MyObject.instance_of.my_value
在视图中
<input type="text" value="<%= @my_value %>" />