yposiのブログ

Web開発日記

キャッシュを親子に持たせるのは危険。子が死んでも親は残り続ける。

Rails.cacheの中でRails.cacheをするのは危険。 親子関係と呼ぶが正しい表現なのか?

子が死んでも親は残り続ける。

そんな悲しい話ある? プログラミングの話でもあれば悲しい話だと思った今日この頃。

なので子と親に差分があって、 更新系のあるデータを扱う場合でもそうでない場合でもやるな。 絶対やるなという話。

コンソール上で適当にやった

def caching_test(id)
  Rails.cache.fetch("user-caching-#{id}", expires_in: 1.day) do 
    lost_caching(id)
  end
end

def lost_caching(id)
  Rails.cache.fetch("user-child-caching-#{id}", expires_in: 60.seconds) do 
    User.find(id)
  end
end

user = caching_test(1)
=> #<User id: 1, ...>

Rails.cache.fetch("user-caching-1")
=> #<User id: 1, ...>

Rails.cache.fetch("user-child-caching-1")
=> #<User id: 1, ...>

1分たった後に

Rails.cache.fetch("user-child-caching-1")
=> nil

消えた。よし!

Rails.cache.fetch("user-caching-1")
=> #<User id: 1, ...>

いた。悲しい。

ちなみに更新系は値が変わらないで生き続けるので要注意。

あんまりRails.cache周りのコマンドを知らない人は参考になるサイト。
僕もあれって一瞬なったので、参考にさせてもらったサイト載せさせていただきます。

morizyun.github.io