Je déplace une application Web Google App Engine en dehors du "cloud" vers un framework Web standard (webpy) et j'aimerais savoir comment implémenter une fonctionnalité memcache disponible sur Gae.Homemade tiny memcache
Dans mon application, j'utilise simplement ce cache pour stocker un tas de données extraites d'une API distante toutes les X heures; en d'autres termes je ne souligne pas trop ce cache.
J'ai naïvement mis en œuvre quelque chose comme ceci:
class TinyCache():
class _Container():
def __init__(self, value, seconds):
self.value = value
self.cache_age = datetime.now()
self.cache_time = timedelta(seconds = seconds)
def is_stale(self):
return self.cache_age + self.cache_time < datetime.now()
def __init__(self):
self.dict_cache={}
def add(self, key, value, seconds = 7200):
self.dict_cache[key] = self._Container(value, seconds)
def get(self, key):
if key in self.dict_cache:
if self.dict_cache[key].is_stale():
del self.dict_cache[key]
return None
else:
return self.dict_cache[key].value
else:
return None
Une utilisation typique serait:
data = tinycache.get("remote_api_data")
if data is not None:
return data
else:
data = self.api_call()
tinycache.add("remote_api_data", data, 7200)
return data
Comment pourrais-je améliorer?
Ai-je besoin de le rendre résistant aux threads?
La plupart des "frameworks web standard" supportent la connexion à un backend cache ... Pourquoi ne pas implémenter un wrapper qui essaye le backend GAE, et s'il n'est pas disponible, revient à 'memcached' (ou à l'API Django Cache, si vous utilisez Django). Avez-vous accès à une instance memcache "hors du cloud"? –
Non, memcached n'est pas une option car elle n'est pas supportée par mon fournisseur. En outre, le backend GAE n'est pas une option aussi ... pourquoi ai-je besoin d'un aller-retour si long pour quelque chose qui doit être rapide? – systempuntoout