Torihaji's Growth Diary

Little by little, no hurry.

Railsのdefaultで使われるメモリのキャッシュが本当に別プロセスで使えないか試してみた。

はじめに

みなさん、こんにちは torihaziです。

さっきのAIチャットbotをRedis、Sidekiqと合わせて使うためにRedisについて学んでいるのですが、

そこでキャッシュにまつわる記載が出てきたので、そこに対する理解を深めようと今こうして書いてます。

というかそもそもなんでredisじゃないとダメなのか、使わないとダメなのかを詳しく知る上で。

で結論言うと、railsデフォルトのキャッシュだと、別プロセスで使えないとか再起動したら吹っ飛ぶとかが原因でダメっぽいです。

別プロセスで使えないと何がダメかっていうと、他のサーバから見えないし使えないから?だと。

それがredisを使えば解決されると。

で、この別プロセスで使えないと言う日本語がよくわからなかったので実際にやってみました。

とりあえずやってみる、そう言う記事です。

Railsの立ち上げ

なんでもいいです。rails new して立ち上げてください。

GitHub - torihazi/chat_bot_rails

こいつcloneしてbuildして、やったら多分いけます。dbのcreateとかは適宜お願いします。

で、できた状態で話を進めます。

まずキャッシュを使いたいのですが、そもそも今キャッシュを使えるか実際にやってみます。

docker compose up -dしてrails c してコンソールに入ってください。

Railsでキャッシュを扱うためには Rails.cacheを使うのでキャッシュの書き込みをするために

Rails.cache.write("hoge","huga")で書き込みます。

そうするとtrueと返ってきます。

ちなみにさっきの例はkeyがhogevalueがhuga と言うデータをキャッシュに書き込むよって意味です。

で次は読み取りです。

勘の言い方ならRails.cacheときて何かわかるんじゃないでしょうか。

はい。Rails.cache.read("hoge")です。指定はkeyを指定します。

そうするとキャッシュが機能していれば出力形式は知らないとしても何かしら返ってくるはずですが

結果はnilと返ってきます。

なんでそうなるか。

config/development.rbのcache_storeと言う項目があるのでみてください。

  # Enable/disable caching. By default caching is disabled.
  # Run rails dev:cache to toggle caching.
  if Rails.root.join("tmp/caching-dev.txt").exist?
    config.cache_store = :memory_store
    config.public_file_server.headers = {
      "Cache-Control" => "public, max-age=#{2.days.to_i}"
    }
  else
    config.action_controller.perform_caching = false

    config.cache_store = :null_store
  end

20行目くらいになんか書いてありますね。

よくわかんないけど、tmp下にファイルがなければcache使わない、みたいなことがわかります。

じゃあそのファイル作りましょう。

作り方はコマンドがあって rails dev:cacheです。

これでtmp下覗いてみると作成されます。

じゃあ一回コンテナ再起動してやってみましょう。

立ち上がったらrails cして入って

irb(main):002> Rails.cache.write("hoge", "hoge")
=> true
irb(main):003> 
irb(main):004> 
irb(main):005> Rails.cache.read("hoge")
=> "hoge"

てしたらさっきできなかったことができてますね。

※ちなみにさっき作ったtmpのファイルですが、書き込まれることはないそうです。

あるかないかだけが重要なフラグ目的のファイルだそうです。

書き込まれているのはメモリ上ですね。

でだ。

じゃあ書けるようになったので、タイトルのことをやります。

別プロセスで書く

と言ってもどうするの、と思った方いると思います。

自分もその1人です。

別プロセス。

ターミナル2つ立ち上げてそれぞれでdocker compose exec rails cすればいいだけです。

と言うことでやってみましょう。

Vscodeで立ち上げてそれぞれでrails cをしました。

左では実際に書き込んで読み込めていますが、右では読み込めていません。

と言うことらしいです。

これが redisっていう共通の窓口さえあれば2人仲良く覗きにいけてデータも見れるで

ちゃんちゃん、というハッピーハッピーな結末になるみたいですね。

終わりに

そゆこと。

納得です。ならredis使わないとダメですね。

頑張りますか。

では。