2010-07-21 14 views
4

J'ai créé une application en utilisant GAE. J'attends 100k demande par jour. À l'heure actuelle, pour chaque demande, l'application doit rechercher 4 tables et 8 colonnes de diff avant d'effectuer la tâche nécessaire.Utilisation de memcache dans google app engine

Ces 4 tables sont mes tables principales ayant 5, 500, 200 et 30 enregistrements. Il est inférieur à 1 Mo (la limite).

Maintenant, je veux mettre mes fiches dans memcache pour un accès plus rapide et réduire l'appel RPC. Quand un maître de mise à jour utilisateur, je vais remplacer l'objet memcache.

J'ai besoin de suggestions de la communauté à ce sujet.

Est-il possible de changer le design actuel?

Comment mettre 4 données de table maître dans memcache?

Voici comment l'application fonctionne actuellement

  1. 100 d'utilisateurs accèdent même page d'application.
  2. Ils fournissent un jeton d'identification unique et 3 autres paramètres (disons p1, p2 et p3).
  3. Ma servlet reçoit la requête.
  4. L'application récupère la table utilisateur par jeton et vérifie l'état d'activation.
  5. L'application récupère une autre table (disons department) et vérifie l'existence de p1. Si existe, cochez l'état d'activation.
  6. Si au-dessus renvoie vrai, une table de service est interrogée sur la base du paramètre p2 pour vérifier si ce service est activé ou non pour cet utilisateur et vérifier Service EndDate.
  7. En fonction de la longueur de p3, une autre table est vérifiée pour la disponibilité.
+0

Vous devez utiliser memcache uniquement pour les opérations de données fréquentes. – RubyDubee

+0

Oui, vous devez fournir plus d'informations avant que nous puissions être plus utiles. Il est probable qu'il existe de très bonnes optimisations si nous en savons plus sur les données. – Jacob

+0

voir la question éditée – Manjoor

Répondre

6

Vous ne devriez pas penser en termes d'insertion de tables dans memcache. Utilisez plutôt une stratégie de cache optimiste: chaque fois que vous devez effectuer une opération que vous souhaitez mettre en cache, commencez par la rechercher dans memcache, et si cela échoue, récupérez-la dans le magasin de données, puis stockez-la dans memcache. Voici un exemple:

def cached_get(key): 
    entity = memcache.get(str(key)) 
    if not entity: 
    entity = db.get(key) 
    memcache.set(str(key), entity) 
    return entity 

Notez, cependant, que la mise en cache des entités individuelles est assez faible rendement - est le datastore assez rapide à faire fetch. La mise en cache des résultats de requête ou des pages rendues donnera une bien meilleure amélioration de la vitesse.

+0

Mon problème est toujours là. Je veux réinstaller des RPC. – Manjoor

+0

Vous allez devoir être plus précis sur votre problème et sur ce qui ne va pas dans ma réponse, si vous voulez que quelqu'un puisse vous aider. –

+0

Manjoor: Réduire les RPC est une bonne idée, mais vous devez récupérer vos données quelque part. De plus, tous les RPC ne coûtent pas le même prix - memcache ne devrait normalement avoir que quelques millisecondes de surcharge. La latence RPC du datastore est souvent un peu plus élevée (~ 100x). –