2017-07-07 5 views
0

私はFlask-RestfulをPython APIに使用しています。これはうまくいきます。 私はキャッシュしたいDB操作がほとんどありません。どうすればよいですか?私はオンラインで検索し、フラスコキャッシュとCacheToolsのようなオプションがいくつかあり、私は決定できません。Pythonのキャッシングに関するアドバイス

フラスコキャッシュは、主に内部で使用されているデータではなく要求をキャッシュしていましたが、私が間違っていれば私を修正しました。

Cachetoolsにはlru_cacheなどの便利なメソッドがありますが、これは私の役に立つかもしれませんか?

PS:私は主にJavaの人で、以前のサービスでは春のブート時にグアバを使用していましたので、Pythonでそのようなものを探していました。

+1

Flaskキャッシュキャッシュ要求への応答。 lru_cacheは関数の戻り値をキャッシュするため、CacheToolsにはさまざまなキャッシュ方法が用意されています。私は春のブートが何をしているのか分かりませんが、あなたが必要としている場所やキャッシュする内容に依存し、単一の解決策はありません。 – syntonym

+0

こんにちは、私は基本的に私の要求が一意になるため、要求よりもむしろデータをキャッシュしたいと思っています。 – xmen

答えて

0

これまで私もこの問題を抱えていました。 最後に、私はRedisを使用します。

werkeugには、Redisを使いやすくするキャッシュlibがあります。詳細については、

from werkzeug.contrib.cache import RedisCache

、あなたのアプリケーションを単一のプロセスで実行されている場合、ところでdoc

を参照してください(マルチスレッドでもOKです)、あなただけの以下のコードを使用することができます。

class CachedItem: 
    def __init__(self, item, duration): 
     self.item = item 
     self.duration = duration 
     self.time_stamp = time.time() 

    def __repr__(self): 
     return '<CachedItem {%s} expires at: %s>' % (self.item, time.time() + self.duration) 


class CachedDict(dict): 
    def __init__(self, *args, **kwargs): 
     super(CachedDict, self).__init__(*args, **kwargs) 
     self.lock = threading.Lock() 

    def get_cache(self, key, default=None, duration=300): 
     with self.lock: 
      self._clean() 
      if key in self: 
       return self[key].item 
      else: 
       self[key] = CachedItem(default, duration) 
      return self[key].item 

    def set_cache(self, key, value, duration=300): 
     with self.lock: 
      self[key] = CachedItem(value, duration) 

    def _clean(self): 
     for key in list(self.keys()): # [self.keys()] error, we get dict_keys type 
      if self[key].time_stamp + self[key].duration <= time.time(): 
       self.pop(key) 
関連する問題