缓存通过 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 有缓存的情况下,图片名称不变,链接不变,只有图片变化的情况下,如何知道图片发生变化需要更新图片?