2010-11-17 33 views
1

我目前正在致力于一些网站对eBay和亚马逊等大牌在线卖家进行多次调取以获取某些商品的价格。问题是,目前需要几秒钟(据我所知,这次是来自拨打电话)加载结果,我希望更加及时(大约10秒,在我看来是太多了)。缓存通过API获取的在线价格,除非它们发生变化

我已经缓存了其他需要提取的信息,但该信息是静态的。有没有办法可以缓存价格,但只在需要时更新它们?代码使用Python,我将信息存储在mySQL数据库中。

我在想方设法使用chron或其他方法来每隔一段时间更新一次,但如果对这个问题有一个更简单和不太激烈的方法,那将会很好。

谢谢!

回答

2

你有没有想过显示缓存的数据,然后通过ajax回调更新价格?如果价格因SO型通知栏或类似物而发生变化,您可以通知用户。

这样用户可以立即得到结果,并在价格可用时更新价格。

编辑

您可以使用jQuery:

假设你有一个返回该项目的ID的JSON数组的脚本名称getPrices.php,并且它的价格。

没有错误处理等在这里,只是给你一个想法

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

这是一个奇妙的想法!我可以在哪里了解更多关于这方面的信 – Parker 2010-11-17 21:11:46

3

您可以使用memcache来执行缓存。第一个请求会很慢,但其余的请求应该是即时的。尽管如此,你仍然需要一个cron作业来保持它的最新状态。更多的缓存信息在这里:Good examples of python-memcache (memcached) being used in Python?

+2

你并不需要一个cronjob。更简单的解决方案可能是设置过期时间,如果在memcache中找不到它,则调用存储。 – 2010-11-17 20:53:09

+0

谢谢马特! (你们两个!)有没有办法在后台调用它,所以用户不必等待? – Parker 2010-11-17 21:11:10

+0

你想排队并检查背景,而不是做一个cron工作?根据你的平台,你可能想尝试Celery(http://ask.github.com/celery/getting-started/introduction.html)或者做一些自定义线程 – 2010-11-17 21:36:46

2

您需要处理应用程序中的以下内容:

  1. 得到的价格
  2. 确定价格已变
  3. 缓存价格信息

对于第1步,您需要考虑物品价格多久更改一次。我会用你的本能去设定一个Cron工作,以便在设定的时间间隔内检查项目(或项目组)上的新价格。这在小规模时是微不足道的,但是当你拥有数以万计的项目时,这个系统的架构将变得非常重要。

为避免页面加载延迟,尽可能提前获取信息。我不知道您的用例,但尽可能预取信息并避免让用户等待异步JavaScript调用完成。

对于第2步,如果是新项目或价格已更改,请更新缓存系统中的信息。

对于第3步,您需要确定最适合您需求的缓存系统。正如其他人所建议的,memcached是一个可能的解决方案。有多种可以检出的“NoSQL”数据库,甚至可以在MySQL中缓存结果。

0

你最近怎么样?如果使用BeautifulSoup等工具从正常的HTML页面中删除数据,这可能会减慢往返时间。在这种情况下,它可能有助于在解析之前从页面计算快速校验和(例如MD5)以查看它是否已更改。如果您使用的API提供价格的简短XML版本,这可能不是问题。

+0

嘿,安迪!我曾经使用BS,但在听说速度问题后,我转换到了lxml。该网站是BlueDevilBooks.com,它并没有显示许多网站,所以我不能想象解析可能真的花费那么多时间,对吧?但我会再次检查cProfile,看看问题是什么。并感谢您的校验和想法! – Parker 2010-11-19 01:46:28

相关问题