短いバージョン: Django(理想的にはDjango 1.7)では、毎日午前2時に特定のデータベースオブジェクトを1回だけ読み込み、 。私が毎回MyModel.objects.get()
を実行するたびに、にはには触れません。それはキャッシュを使用します。その後、午前2時にキャッシュを手動で更新します。私はではないMyModel.objects.get()
のようなクエリを持つすべての単一の行を変更したいのですが、これは100行以上を変更する必要があり、冗長になるからです。DB検索を行うすべての行を変更せずにDjangoデータベースオブジェクトをキャッシュしたい
ロングバージョン:
私は古いと完全に賢明ではない、非常に大きなDjangoプロジェクトで働いています。 Djangoアプリケーションは、保護されたデータベースオブジェクト(行、モデルインスタンス)のセットを読み込み、一貫性をチェックしてから正確にの値を翌日まで使用します。これらのデータベースオブジェクト(行)は、のみが午前2時に予定されたダウンタイムの間に変更され、一日のうちにそれらを変更すると、データが破損し、混乱することになります。
スケジューリングされたダウンタイムになっていないときにこれらのデータベースオブジェクトを変更しようとすると、すでにエラーが出力されたpre_save
フックを書きました。また、Django管理コンソールを使用して、これらのデータベーステーブルにアクセスする人はほとんどいませんでした。
しかし、実際にデータベースに1日に1回だけヒットする必要があるにもかかわらず、これらのオブジェクトが使用されるたびに実際にデータベースにヒットするため、パフォーマンスは低くなります。このように、
悲しいことに、コードのルックアップの100以上の行があり、その後、テーブルを使用します。
# In views.py:
from myapp.models import WidgetType
# In literally over 100 places:
widget_t1 = WidgetType.objects.get(pk=1)
local_var.part_num = widget_t1.part_num
それはWidgetType.objects.get
言うひとつひとつの時間が、私はそれがのキャッシュされたバージョンを使用したいですデータベースオブジェクト。私は午前2時に1日に一度手動でキャッシュをリフレッシュしたいだけです。パフォーマンスとデータ破壊に対する余分な安全のためです。
cache
モジュールを毎回使用したくないのは、100行以上のコードを変更する必要があり、コードをより冗長にするためです。
問題1:そのパッケージはDjangoの1.8+を必要とし、私はDjangoの1.7をターゲットとしたいと思いますここで自動的にいくつかのDBを読み取って、他の人のための
.cache()
とマニュアルのキャッシングを可能にキャッシュする設定例はあります。 問題2:Redisのインストールが必要なパッケージで、依存関係を追加しないでください。ローカルのハードドライブ上のファイルベースのキャッシュは、非ローカルで負荷のかかるデータベースにアクセスするよりも高速になります。 – SerMetAlaこれは次のバージョンのみです。 3.2.1はまだDjango 1.7をサポートしています - https://pypi.python.org/pypi/django-cacheops – kichik
Redisはメモリ内にあり、ローカルにインストールすることができます。それはファイルを読むよりはるかに速くなければなりません。 – kichik