2012-01-21 10 views
0

私は多くのエネルギー測定レコードをモデルに保存しています。処理されたデータをdjangoにキャッシュする

ユーザーは頻繁にエネルギー使用量レポートにアクセスする必要がありますので、model.managerは多くのレコードをクエリし、2秒間かかっているアルゴリズムを適用しています。しばらくするとキャッシュされたデータは利用できなくなりますが、ユーザーは同じレポートを表示することがよくあります。したがって、このパフォーマンス問題に対する私の潜在的な解決策は、 "ProcessedData"と呼ばれるモデルに処理されたデータ(クエリーセットだけでなく、アルゴリズムアプリケーションの後にデータクエリーセット)を格納することです。

エネルギーレポートへのアクセスが促された場合、課金されたマネージャは最初にProccessDataを照会し、ProccessData.objects.filter(field1='field1').exist():返されたデータは視覚化のために直接テンプレートに渡されます。必要なデータが以前に要求されていない場合、課金されたマネージャはアルゴリズムを適用し、要求をユーザに返す必要があります。

これは良いアプローチですか?

答えて

1

このようなことを始める前に、私は間違いなくdjango-cache-machineまたはjohnny-cacheのようなプロジェクトを試してみることにしました。それらはモデルキャッシングを行い、うまくやっています。

私はjohnnyキャッシュだと思っています。それは決して一切のクエリーセットキャッシングをしないので、あなたのニーズに合っています。

「キャッシュデータが利用できません」という意味はわかりませんが、いくつかの方法で簡単に解決できるものです(たとえば、redisのような永続キャッシュバックエンドを使用するなど)。

これは、クエリーセットキャッシング以上のものが必要な場合に実装しようとしているデータベースキャッシングの前に試すもう1つの方法です。

Djangoのキャッシュutilsのは、(ドキュメントや例hereを参照)、キャッシングのパラメータに基づいてんた素敵なキャッシュデコレータ(@cached)が付属しています

+0

私は、入力として、私が知っている、クエリ、そのクエリの結果を使用してデータを処理しますjohny-cacheのmemcacheを使用すると、ユーザーに送信されたリクエストさえもキャッシュされますが、そのデータが12時間後に必要になったときに問題が発生します。その場合は、他のユーザーとのデータベースのやり取り量最初にキャッシュされた処理済データは使用できません。 – Jaime

+1

django-cache-utilsの@cachedデコレータのようなものを試してみましたか?それを永久キャッシュを行わないカスタムキャッシュバックエンドと組み合わせてください(例えば、johnnyキャッシュはdjangoが "永遠"をサポートしないのでキャッシュを行います)。 –

関連する問題