Rails3で、dalliを使ってRails.cacheでMemcachedを扱う上で、値の更新が反映されるタイミングについて質問です。


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

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2013/08/06 18:20:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:nacookan

memcachedを-vvvで立ち上げて、リクエストが来たらわかるようにしてテストしてみました。

そうしたら、Aのプロセスではループの最初の1回目のRails.cache.readのときしかmemcachedに対してリクエストは来てませんでした。

それ以降は、Rails.cache.readをしてもmemcachedにはアクセスせず、プロセス内部で持ってる値を返してるようです。なので、別なプロセスからmemcachedのデータをRails.cache.writeで更新しても、無限ループしてる方には反映されないようです。

非常に残念なんですが、なんとかなりませんか。。。

回答0件)

回答はまだありません

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません