2010-11-17 14 views
1

Je travaille actuellement sur un site qui fait plusieurs appels à des vendeurs en ligne de grands noms comme eBay et Amazon pour obtenir des prix pour certains articles. Le problème est, actuellement cela prend quelques secondes (autant que je peux dire, ce temps est de faire les appels) pour charger les résultats, que je voudrais être plus instantané (~ 10 secondes est trop selon moi).Mise en cache des prix en ligne via API à moins qu'ils ne changent

J'ai déjà mis en cache d'autres informations que je dois récupérer, mais ces informations sont statiques. Est-il possible de mettre en cache les prix mais de les mettre à jour uniquement en cas de besoin? Le code est en Python et je stocke des informations dans une base de données MySQL. Je pensais d'une certaine façon utiliser chron ou quelque chose comme ça pour le mettre à jour de temps en temps, mais ce serait bien s'il y avait une approche plus simple et moins intense à ce problème.

Merci!

Répondre

2

Avez-vous pensé à afficher les données mises en cache, puis mettre à jour les prix via un rappel ajax? Vous pouvez informer l'utilisateur si le prix a changé avec une barre de notification de type SO ou similaire.

De cette façon, les utilisateurs obtiennent des résultats immédiatement, et des prix mis à jour lorsqu'ils sont disponibles.

Modifier

Vous pouvez utiliser jquery:

Supposons que vous avez un nom de script getPrices.php qui retourne un tableau JSON de l'ID de l'élément, et son prix.

Pas de traitement des erreurs etc ici, juste pour vous donner une idée

My necklace: <div id='1'> $123.50 </div><br> 
My bracelet: <div id='1'> $13.50 </div><br> 
... 

<script> 
$(document).ready(function() { 
    $.ajax({ url: "getPrices.php", context: document.body, success: function(data){ 
     for (var price in data) 
     { 
      $(price.id).html(price.price); 
     } 
    }})); 
</script> 
+0

C'est une idée fantastique! Où puis-je en apprendre plus à ce sujet? – Parker

3

Vous pouvez utiliser memcache pour effectuer la mise en cache. La première requête sera lente, mais les demandes restantes doivent être instantanées. Vous aurez besoin d'un travail cron pour le garder à jour si. Plus d'informations de mise en cache ici: Good examples of python-memcache (memcached) being used in Python?

+2

Vous n'avez pas vraiment besoin d'un cronjob. Une solution plus simple est probablement de définir une expiration, puis d'appeler le magasin si vous ne pouvez pas le trouver dans memcache. –

+0

Merci Matt! (Vous deux!) Y at-il un moyen de l'appeler en arrière-plan, de sorte que l'utilisateur n'a pas à attendre? – Parker

+0

Vous voulez faire la queue et vérifier en arrière-plan au lieu de faire un travail cron? Selon la plate-forme sur laquelle vous êtes, vous pouvez essayer Celery (http://ask.github.com/celery/getting-started/introduction.html) ou faire un filetage personnalisé –

2

Vous devez gérer les éléments suivants dans votre application:

  1. obtenir le prix
  2. déterminer si la Le prix a changé
  3. Cachez les informations de prix

Pour l'étape 1, vous devez prendre en compte la fréquence à laquelle les prix des articles changent. Je voudrais aller avec votre instinct pour définir un travail Cron pour un processus qui va vérifier les nouveaux prix sur les articles (ou sur des ensembles d'articles) à intervalles réguliers. C'est trivial à petite échelle, mais lorsque vous avez des dizaines de milliers d'éléments, l'architecture de ce système deviendra très importante.

Pour éviter les retards dans le chargement de la page, essayez d'obtenir les informations à l'avance autant que possible. Je ne connais pas votre cas d'utilisation, mais il serait bon de préfixer les informations autant que possible et d'éviter que l'utilisateur attende la fin d'un appel JavaScript asynchrone.

Pour l'étape 2, s'il s'agit d'un nouvel élément ou si le prix a changé, mettez à jour les informations dans votre système de mise en cache.

Pour l'étape 3, vous devez déterminer le meilleur système de mise en cache pour vos besoins.Comme d'autres l'ont suggéré, memcached est une solution possible. Il existe une variété de bases de données "NoSQL" que vous pouvez consulter, ou même mettre en cache les résultats dans MySQL.

0

Comment obtenez-vous le prix? Si vous supprimez les données de la page HTML normale à l'aide d'un outil tel que BeautifulSoup, cela peut ralentir le temps d'aller-retour. Dans ce cas, il peut être utile de calculer une somme de contrôle rapide (telle que MD5) de la page pour voir si elle a changé, avant de l'analyser. Si vous utilisez une API qui donne une version XML courte du prix, ce n'est probablement pas un problème.

+0

Salut Andy! J'avais l'habitude d'utiliser BS, mais je suis passé à lxml après avoir entendu parler des problèmes de vitesse. Le site est BlueDevilBooks.com, et il ne montre pas que de nombreux sites, donc je ne peux pas imaginer que l'analyse pourrait prendre beaucoup de temps, non? Je revérifierai cProfile encore pour voir quel est le problème. Et merci pour l'idée de checksum! – Parker