【问题标题】:Caching online prices fetched via API unless they change缓存通过 API 获取的在线价格,除非它们发生变化
【发布时间】:2011-05-11 16:10:52
【问题描述】:

我目前正在开发一个网站,该网站多次致电 eBay 和亚马逊等知名在线卖家,以获取某些商品的价格。问题是,目前需要几秒钟(据我所知,这次是从拨打电话开始)来加载结果,我想更即时(我认为大约 10 秒太多了)。

我已经缓存了其他需要获取的信息,但这些信息是静态的。有没有一种方法可以缓存价格但仅在需要时更新它们?代码在 Python 中,我将信息存储在 mySQL 数据库中。

我正在考虑以某种方式使用 chron 或类似的东西来经常更新它,但如果有一个更简单且不那么强烈的方法来解决这个问题会很好。

谢谢!

【问题讨论】:

    标签: python mysql html caching


    【解决方案1】:

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

    【讨论】:

    • 你真的不需要 cronjob。一个更简单的解决方案可能是设置一个过期时间,然后如果你在 memcache 中找不到它就调用存储。
    • 谢谢马特! (你们俩!)有没有办法在后台调用它,让用户不必等待?
    • 您想排队并在后台检查而不是执行 cron 作业?根据您使用的平台,您可能想尝试 Celery (ask.github.com/celery/getting-started/introduction.html) 或制作一些自定义线程
    • @Matthew Flaschen,唯一的问题是我们可能只想在价格发生变化时删除内存缓存记录,而不是在一段时间后。
    • 不检查就无法知道价格是否发生了变化。过期是确保您检查的一种方式。
    【解决方案2】:

    您是否考虑过显示缓存数据,然后通过 ajax 回调更新价格?如果价格发生变化,您可以通过 SO 类型的通知栏或类似的方式通知用户。

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

    编辑

    你可以使用jquery:

    假设您有一个脚本名称 getPrices.php,它返回一个包含商品 id 的 json 数组,它是价格。

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

     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>
    

    【讨论】:

      【解决方案3】:

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

      1. 获取价格
      2. 确定价格是否发生变化
      3. 缓存价格信息

      对于第 1 步,您需要考虑商品价格的变化频率。我会按照你的直觉为一个进程设置一个 Cron 作业,该进程将在设定的时间间隔检查项目(或项目组)的新价格。这在小规模上是微不足道的,但是当您拥有数万个项目时,该系统的架构将变得非常重要。

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

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

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

      【讨论】:

        【解决方案4】:

        你是怎么知道价格的?如果您使用 BeautifulSoup 之类的工具从普通 HTML 页面中抓取数据,则可能会减慢往返时间。在这种情况下,在解析之前从页面计算快速校验和(例如 MD5)以查看它是否已更改可能会有所帮助。如果您使用的 API 提供了价格的简短 XML 版本,这可能不是问题。

        【讨论】:

        • 嘿安迪!我曾经使用 BS,但在听说速度问题后我切换到 lxml。该站点是 BlueDevilBooks.com ,它没有显示那么多站点,所以我无法想象解析真的会占用那么多时间,对吧?我会再次仔细检查 cProfile 以查看问题所在。并感谢您提供校验和的想法!
        猜你喜欢
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 2016-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-09
        • 2014-10-23
        相关资源
        最近更新 更多