2017-07-05 4 views
1

短いバージョン: 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-cacheops自動キャッシュのオプションが用意されています。

CACHEOPS = { 
    # Automatically cache any User.objects.get() calls for 15 minutes 
    # This includes request.user or post.author access, 
    # where Post.author is a foreign key to auth.User 
    'auth.user': {'ops': 'get', 'timeout': 60*15}, 

    # Automatically cache all gets and queryset fetches 
    # to other django.contrib.auth models for an hour 
    'auth.*': {'ops': ('fetch', 'get'), 'timeout': 60*60}, 

    # Cache all queries to Permission 
    # 'all' is just an alias for {'get', 'fetch', 'count', 'aggregate', 'exists'} 
    'auth.permission': {'ops': 'all', 'timeout': 60*60}, 

    # Enable manual caching on all other models with default timeout of an hour 
    # Use Post.objects.cache().get(...) 
    # or Tags.objects.filter(...).order_by(...).cache() 
    # to cache particular ORM request. 
    # Invalidation is still automatic 
    '*.*': {'ops':(), 'timeout': 60*60}, 

    # And since ops is empty by default you can rewrite last line as: 
    '*.*': {'timeout': 60*60}, 
} 
+0

問題1:そのパッケージはDjangoの1.8+を必要とし、私はDjangoの1.7をターゲットとしたいと思いますここで自動的にいくつかのDBを読み取って、他の人のための.cache()とマニュアルのキャッシングを可能にキャッシュする設定例はあります。 問題2:Redisのインストールが必要なパッケージで、依存関係を追加しないでください。ローカルのハードドライブ上のファイルベースのキャッシュは、非ローカルで負荷のかかるデータベースにアクセスするよりも高速になります。 – SerMetAla

+1

これは次のバージョンのみです。 3.2.1はまだDjango 1.7をサポートしています - https://pypi.python.org/pypi/django-cacheops – kichik

+0

Redisはメモリ内にあり、ローカルにインストールすることができます。それはファイルを読むよりはるかに速くなければなりません。 – kichik

関連する問題