缓存通过 API 获取的在线价格,除非它们发生变化

Posted

技术标签:

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

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

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

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

谢谢!

【问题讨论】:

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

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

嘿安迪!我曾经使用 BS,但在听说速度问题后我切换到 lxml。该站点是 BlueDevilBooks.com ,它没有显示那么多站点,所以我无法想象解析真的会占用那么多时间,对吧?我会再次仔细检查 cProfile 以查看问题所在。并感谢您提供校验和的想法!

以上是关于缓存通过 API 获取的在线价格,除非它们发生变化的主要内容,如果未能解决你的问题,请参考以下文章

多次响应实时数据获取

image 有缓存的情况下,图片名称不变,链接不变,只有图片变化的情况下,如何知道图片发生变化需要更新图片?

如何通过 youtube API 判断 youtube 视频的内​​容何时发生变化?

页面缓存-freemarker静态处理

当实际数据发生变化时,结果缓存数据会发生啥变化?

获取第n个连续组的第一行/最后一行