2017-07-07 2 views
0

J'utilise Flask-Restful pour une API Python, qui fonctionne bien. Maintenant, il y a peu d'opérations de DB que je veux mettre en cache, comment puis-je faire? J'ai cherché en ligne et il y avait quelques options comme le cache de flask et CacheTools et je ne suis pas capable de décider.Conseil en cache pour python

Le cache Flask consistait principalement à mettre en cache les requêtes plutôt que les données utilisées à l'intérieur, corrigez-moi si je me trompe.

Cachetools a des méthodes utiles comme lru_cache etc. qui pourraient m'être utiles? PS: Je suis principalement un gars de Java et utilisé pour utiliser goyave avec démarrage au printemps dans mes services précédents, donc à la recherche de quelque chose comme ça en python.

+1

Flask Cache met en cache les réponses aux demandes. lru_cache met en cache les valeurs de retour des fonctions, CacheTools vous propose différentes stratégies de cache et ce que vous en faites dépend de vous. Je n'ai aucune idée de ce que Spring Boot fait, mais cela dépend de vos besoins où et ce que vous voulez mettre en cache et il n'y a pas de solution unique. – syntonym

+0

salut, je veux essentiellement mettre en cache des données plutôt que des demandes, parce que mes demandes sont presque toujours uniques. – xmen

Répondre

0

Plus tôt, j'ai eu ce problème aussi. En fin de compte, j'utilise Redis.

Et dans werkeug, il y a une bibliothèque de cache, ce qui rend Redis facile à utiliser.

from werkzeug.contrib.cache import RedisCache

pour plus d'informations, consultez le doc

Par ailleurs, si votre application fonctionne en même processus (multithread est OK), vous pouvez simplement utiliser les codes ci-dessous.

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)