Adventarの5日目の記事です。はじめにMemcachedへModelオブジェクトをキャッシュさせる自作Gemを紹介し、それを通してどれぐらい性能改善が期待できるか確認していきたいと思います。Memcachedの利点MemcachedにModelオブジェクトをキャッシュする利点は以下の通りだと想定しています。DBからデーターを読み込む回数を軽減させ、DBに対する集中負荷を減らす。オブジェクトのロードを高速化する。上記の想定を元に、Modelに関連された(Associted)オブジェクト達をキャッシュにいれてそこから取り出すようにすれば、DBへの負荷を減らし、Railsアプリケーションをもっと高速化できるのではないかと思い、一つのGemを作って検証してみました。自作Gemリポジトリhttps://github.com/begaborn/simple_cache概要SimpleCacheはあるオブジェクトとそれに関連された(Association)オブジェクトをキャッシュするライブラリです。以下のような1対多関係のModelがあるとします。オブジェクト達をデーターベースから取り出します(retrieve)。オブジェクトをMemcachedにキャッシュさせます。そのあと、このコードが再度実行されると、このオブジェクトをDBからではなく、Memcachedから取り出します。User.take.user_characters.firstもし、データーの更新・作成・削除が発生した場合にトランザクションのコミットのタイミングでキャッシュデーターはリフレッシュされます。InstalllさっそくRailsアプリケーションに入れてみます。install基本、入れるだけで何もやる必要はありません。初回ロード時は、SQLを発行し、Modelオブジェクトを生成することが確認できます。1,...2番目からは、SQLを発行せず、Memcachedから持ってくることが確認できます。1,...ベンチマークどれぐらい性能改善が期待できるか確認していきます。測定環境は以下の通りになります。MacBookローカル上にMemcachedとMySqlが動いている状態。※MemcachedとMySQLそれぞれ立ててやりたかったんですが、今回はパスします。読み込み速度を測定するために、以下のベンチマークテストコードを実行してみました。ModelオブジェクトをMemcachedにキャッシュさせ、キャッシュから読み込む。24.641330)キャッシュからオブジェクトを読むことで、約40%〜50%程度速度が改善されています。以下のテストコードを実行してみます。(177.592329)すごく遅くなったことがわかります。これは当たり前の結果ですね。毎回更新処理が走るので、オブジェクトを生成してキャッシュして、作ったキャッシュを使用せずまたリフレッシュして。そのため、更新頻度が高いものはキャッシュをオフにした方がよいと思います。実は、SimpleCacheはキャッシュをオフにする機能も持っています。1000回に変更しました。(132.392052)一応Rails.cache.readで直接読むようにして、検証してみましたが、結果はほぼ変わっていませんでした。endend大量のオブジェクトをMemcachedから取り出す場合は、むしろDBから取り出して生成するよりも何倍も遅くなりました。関連オブジェクトが大量にある場合もキャッシュをオフにした方が良いかもせれません。注意事項このGemを使う上で注意事項です。Recordコールバックをスキップするメソッドを使って、データーを更新・削除した場合は、キャッシュがリフレッシュされません。することをお勧めします。以下のオプションを指定した場合はキャッシュしません。:inverse_of現在バージョンでは、以下のメソッドのみキャッシュ機能をサポートしています。has_oneまだ開発&検証の最中です!なにか問題とかあればご連絡ください。歓迎です!まとめこの記事でベンチマークを通して以下のことが確認できました。DBからデーターを読み込む回数を軽減できた。オブジェクトのロードが高速化できた。更新頻度が高いものはキャッシュしないほうがよい。オブジェクトをキャッシュするならマスターデーターなどほぼリードオンリのものがおすすめ。一つのKeyに対して重いオブジェクトをValueとしてMemcachedに入れると逆に遅くなる。kamioka@begabornFollow株式会社アカツキ株式会社アカツキは、スマートフォンゲームの企画開発を中心に事業を展開しております。創業以来全てのゲームを内製しているため、高い技術ノウハウが蓄積されています。今後は、新規事業の立ち上げも行ってまいります。upLoginユーザーは見つかりませんでした。