2017-07-07 6 views
0

Ich benutze Flask-Restful für eine Python-API, die gut funktioniert. Nun, es gibt einige DB-Operationen, die ich cachen möchte, wie gehe ich darüber? Ich habe online gesucht und es gab ein paar Optionen wie Flaschcache und CacheTools und ich kann mich nicht entscheiden.Hinweis zum Caching für Python

Flask-Cache war hauptsächlich über das Zwischenspeichern der Anfragen statt die Daten im Inneren verwendet, korrigieren Sie mich, wenn ich falsch liege.

Cachetools hat nützliche Methoden wie lru_cache usw., die mir nützlich sein könnten?

PS: Ich bin in erster Linie ein Java-Typ und verwendet, um Guava mit Spring-Boot in meinen bisherigen Diensten zu verwenden, so etwas in Python suchen.

+1

Flask Cache speichert Antworten auf Anfragen. lru_cache caches returnvalues ​​von Funktionen, CacheTools bietet Ihnen verschiedene Cache-Strategien und was Sie damit machen, bleibt Ihnen überlassen. Ich weiß nicht, was Federboot tut, aber es hängt von Ihren Bedürfnissen ab, wo und was Sie zwischenspeichern wollen und es gibt keine einzige Lösung. – syntonym

+0

hi, ich möchte im Grunde nur Daten zwischenspeichern anstatt Anfragen, weil meine Anfragen fast immer einzigartig sind. – xmen

Antwort

0

Früher hatte ich dieses Problem auch. Am Ende verwende ich Redis.

Und in werkeug gibt es eine Cache-Lib, die Redis einfach zu bedienen macht.

from werkzeug.contrib.cache import RedisCache

Weitere Informationen finden Sie im doc

By the way, wenn Ihre Anwendung in einzelnen Prozess läuft (Multi-Thread auch OK ist), können Sie die Codes unten verwenden nur.

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)