2010-03-13 2 views
2

Je commence à utiliser memcache plus fréquemment pour éviter de devoir recalculer les choses entre les demandes de page. Lorsque le memcache s'efface périodiquement, comme il est conçu pour le faire, je dois recommencer à reconstruire divers éléments que j'ai placés dans memcache. Ce que je voudrais faire est de créer un modèle très simple qui me permet d'enregistrer périodiquement les éléments que j'ai mis dans memcache en fonction des clés memcache que j'utilise avec un datetime qui est lié aux données memcached. Quelle est la meilleure façon de procéder?Dans Google App Engine, quel est le moyen le plus simple de conserver un enregistrement des éléments que vous avez mis dans memcache?

Je cherche quelque chose comme ceci:

class MemcacheRecord(db.Model): 
    key = db.StringProperty(required=True) 
    value = #Something that can store whatever memcache can 
    validThru = db.DateTimeProperty(required=True) 

    def set(self, key, value, validThru): 
     #Save a new memcache record 
     newMemcacheRecord = MemcacheRecord(key=key, value=value, validThru=validThru) 
     .. 
     return True # or False 

    def get_latest(self, key): 
     #Get the memcache record with the most recent validThru datetime 
     latestMemcacheRecord = MemcacheRecord.all().order('-validThru').get() 
     return {'validThru':latestMemcacheRecord.validThru, 'value':latestMemcachRecord.value} 

Répondre

4

Il n'y a probablement pas beaucoup d'avantages à essayer de garder une trace de ce que vous avez enregistré dans memcache, parce que même si vous aviez la liste, il n'y a garantir que les données ont vraiment été préservées. Je pense que la seule façon de travailler avec memcache est d'essayer d'en extraire des données, en espérant qu'il ne soit pas là, même si vous l'avez déjà introduit. Vous devez construire vos algorithmes autour de cela.

+0

Thilo, Laissez-moi élaborer. Après avoir passé tous les cycles du processeur pour calculer quelque chose, je veux l'enregistrer sur bigtable juste avant de le mettre dans memcache. Ensuite, tant que la clé est dans memcache, toutes les pages vont tirer à partir de là. Lorsque le memcache est effacé, je vais récupérer la dernière valeur enregistrée sur bigtable. – Chris

+0

Je ne comprends pas. En quoi est-ce différent d'essayer de charger les données de memcache, et si ce n'est pas le cas, allez à bigtable? Voulez-vous accélérer la partie "essayer de charger à partir de memcache"? – Thilo

+0

Je vois. Vous voulez aussi copier tout ce que vous mettez dans memcache dans bigtable, et vous demandez un modèle de données générique (pour bigtable) qui peut contenir tout ce que vous pouvez stocker dans un enregistrement memcache (avec les méta-données). Droite? – Thilo

1
import pickle 

memcacherecord.value = pickle.dumps(mydict) 
memcacherecord.put() 

mydict = pickle.loads(memcacherecord.value) 

Ce que vous décrivez, vous essayez de faire ressemble à un anti-modèle.

Bien que vous puissiez indiquer une date d'expiration, le fait que votre clé soit toujours enregistrée dans memcache est imprévisible. Essayer de stocker cette information dans le magasin de données sera lent et parfois faux. Comme @Thilo l'a dit, essayez simplement d'obtenir de memcache sans essayer de savoir s'il est déjà là. En cas d'échec, récupérez le magasin de données et placez-le dans memcache pour le demandeur suivant.