2011-01-11 12 views
2

djangoプロジェクトでは、サーバーの制約のためにmemcachedの代わりにキャッシュテーブルを使用するだけで、いくつかのクエリをキャッシュする必要があります。これらのクエリのDjangoでのキャッシュのキャッシュ

一つ次のようになります。

はのは、私がChildオブジェクトをたくさん持っているParentオブジェクトを、持っているとしましょう。 私は単純なクエリparent.childs.all()の結果を保存する必要があります。

私はそれで何の問題もなく、すべてが期待どおりに

key = "%s_children" %(parent.name) 
value = cache.get(key) 
if value is None: 
    cache.set(key, parent.children.all(), CACHE_TIMEOUT) 
    value = cache.get(key) 

のようないくつかのコードで動作します。しかし、時には、ちょうど時々、cache.setは何もしない、と、cache.setを実行した後、cache.get(key)Noneを返し続けます。

いくつかのテストの後、私はparent.children.all().count()がより高い値を持つときにcache.setが動作していないことに気付きました。
つまり、私がkey(例えば)600の子オブジェクトを格納している場合、それはうまく動作します。
しかし、1200の子どもたちで動作しません。

so 私の質問はです:キーに保存できるデータには制限がありますか?どうすればそれを無効にすることができますか?




2番目の質問:、上記のコード、または以下の一つの "より良い" です方法はありますか? cache.setが動作しない場合

key = "%s_children" %(parent.name) 
value = cache.get(key) 
if value is None: 
    value = parent.children.all() 
    cache.set(key, value, CACHE_TIMEOUT) 

番目のバージョンではエラーは発生しませんので、それは私の問題の回避策であってもよいが、明らかないソリューションでした。

一般的に、私の問題について忘れてしまいましょう。どのバージョンを「より良い」と考えていますか?

+1

更新されたコードについて:2番目のバージョンが優れています。 setまたはgetの呼び出しには、データのpickleおよびbase64エンコーディングが含まれているため、これらの呼び出しを最小限に抑えるとパフォーマンスが向上します。 – Seth

答えて

0

3つの可能性があります。

  1. それは、それを保存し、それをエンコードし、それはあなたのクエリを取得するために非常に長い時間を要することになることがあります。あなたは制約リソースで実行していることを言ってきたので、最初は、私には最も可能性が高いと思われますもう一度 - あなたのWebサーバープロセスがメモリ不足またはタイムアウトになり、データが保存される前に終了します。

  2. または、データベースにテキスト列の長さの制限が少なく、1200個のbase64でエンコードされたピクルされたオブジェクトを格納することが制限を超えている可能性があります。

  3. キャッシュキーが255文字を超えている可能性があります。

+0

1.おそらく、私はそうは思わない。 2.これは本当に私にとっては聞こえます... 3.私のキャッシュキーは30文字を超えていないので、これを破棄することができます。 だから私は2番目に行くつもりです...今私は可能な解決策を見つけなければなりません... – dolma33

+0

解決策は簡単です:1200データベースオブジェクトをキャッシュしようとしないでください!真剣に - [ページ](http://docs.djangoproject.com/en/dev/topics/pagination/)。 – Seth

0

memcachedについてのファンキーなこと - 指定されたキャッシュキーに格納できるものについては1MBの制限があります。この制限を設定することはできますが、このデフォルトがコントロール外にあるサーバーにデプロイする場合は、コードの移植性に影響します。

を参照してくださいここでは、 "データのリストを保存する":http://code.google.com/p/memcached/wiki/FAQ

+0

申し訳ありませんが、私はmemcachedを使用していません:代わりにデータベーステーブルを使用しています。 – dolma33

2

は、バックエンドのMySQLのですか?

MySQLでは、TEXTフィールドare limited to 65,000 bytesですが、djangoは値フィールドにこのタイプを使用します。

INSERT &データが大きすぎると、UPDATEクエリが自動的に失敗します。

私の忠告はあなたのデータを小さく保つことです。完全なQuerySetを格納することは過度のようです。必要なフィールドだけを保存することはできませんか?必要なフィールドではなく、完全なインスタンスを取得します。このクエリ

resultset = parent.children.values_list(*fields).all() 

同様

関連する問題