unicornで複数のRailsのプロセスを立ち上げているのですが、片方のプロセスで更新したデータが他のプロセスで実行中の処理に反映されるタイミングに疑問があります。
例えばAのプロセスで
loop do
logger.info Rails.cache.read("hoge")
sleep 1
end
とやって、1秒ごとにキャッシュ "hoge" の値をログに出し続けるとします。
これをやってる間に、Bのプロセスで、
Rails.cache.write("hoge", "1")
とやってキャッシュ "hoge" の値を更新したとしても、Aのプロセスがログに出す値が "1" に変化しません。
しかし、プロセスAを一度止めて、もう一度呼び出すと、"1" が出るようになります。
これはつまり、dalliを使ってMemcachedをストアとしたRails.cache.readは、一度データを読み込んでしまうと、(Rubyプロセス上のメモリにキャッシュしてしまうなどの理由で)他から更新されても反映されないということなのでしょうか?
これをすぐに反映されるようにしたいんですが、何か良い方法はありますか?
ruby 1.9.3p392
rails 3.2.8
dalli 2.6.3
memcached 1.4.4
memcachedを-vvvで立ち上げて、リクエストが来たらわかるようにしてテストしてみました。
そうしたら、Aのプロセスではループの最初の1回目のRails.cache.readのときしかmemcachedに対してリクエストは来てませんでした。
それ以降は、Rails.cache.readをしてもmemcachedにはアクセスせず、プロセス内部で持ってる値を返してるようです。なので、別なプロセスからmemcachedのデータをRails.cache.writeで更新しても、無限ループしてる方には反映されないようです。
非常に残念なんですが、なんとかなりませんか。。。