rails / redis app中的奇怪鬼对象行为

时间:2016-03-05 20:30:14

标签: ruby-on-rails ruby redis publish-subscribe

我正在尝试为RoR应用程序创建一个简单的设置对象。我只想要一个对象类的实例,我希望它能够读/写一个redis数据库。最重要的是,它应该始终与数据库保持同步。由于这个应用程序在heroku上的web dynos上运行,我担心每个dyno都会包含它自己的对象副本,所以我添加了一个redis pubsub设置来通知所有实例db已更新并重新加载数据。这一切似乎都很好 - 保存数据,所有实例都获取消息并自行更新等等。

但是,在将数据加载到视图中时,我有时会看到过时的数据,而我无法确定这些数据的来源。

显示问题的步骤:

  1. 加载页面并查看正确的(db sync' d)数据
  2. 重复刷新页面并查看数据保持不变
  3. 更新数据并回发到数据库
  4. 验证数据库中的数据是否正确
  5. 验证所有正在运行的实例对象是否收到更新消息并打印#value-updated: OK
  6. 验证所有正在运行的实例对象是否包含正确的数据
  7. 重复刷新视图,直到陈旧数据再次显示
  8. 我已经通过验证控制器是否正在从某个地方生活的不同步对象加载陈旧数据来检查该视图是否存在缓存问题。此外,无论有多少次更新数据,都只有一个不同步的对象,并且它始终显示应用程序最初启动时数据库中的数据。

    以下是我正在使用的代码的简化版本。来自铁路大师的任何指针都将非常感激。谢谢!

    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 %>" />
    

0 个答案:

没有答案