mongoidクエリのキャッシュ

概要

Rails の ActiveRecord には、リクエストの存続期間中 SQL クエリの結果を保存するクエリ キャッシング (ActiveRecord::QueryCache) と呼ばれる機能があります。実装の内部についてはあまり詳しくありませんが、クエリ結果は Rack 環境のどこかに保存され、リクエストの最後に破棄されると思います。

残念ながら、Mongoid は現在そのような機能を提供しておらず、一部のクエリが暗黙的に発生するという事実によって事態はさらに悪化しています (参照)。 この機能を実装することを検討していますが、これを実装するには Mongoid (または、おそらく mongo ドライバー?) をどこでどのようにフックする必要があるのかに興味があります。

解決策

Mongoid にはキャッシュがあり、http://mongoid.org/en/mongoid/docs/extras.html で説明されています。

また、MongoDB 自体にもキャッシュ機能があります: http://www.mongodb.org/display/DOCS/Caching

mongoid キャッシュ エクストラは、モデルのすべてのクエリのキャッシュ、またはクエリのキャッシュという 2 つの異なるケースを認識します。

Mongoid のキャッシュの動作は少し異なるようです。mongoid のデリゲートが mongodb にキャッシュするように見えます。 (mongoid のソースでは、キャッシュのオプション設定のみが見つかりますが、キャッシュ モジュールは見つかりません。)

最後に、一般的なキャッシュには実際の違いはなく、メモリ内は実際にはメモリ内であると言えます。アプリ内であってもデータベース内であっても関係ありません。

余分なキャッシュ アルゴリズムを実装することは好みません。これは冗長で RAM キラーになると思われるからです。

ところで: 本当にアプリ内で結果をキャッシュしたい場合は、回避策として Rails.cache または別のキャッシュ gem を試すことができます。