2011-10-05 45 views
2

我已经开始构建一个应用程序,其中的一部分允许用户进行拆分测试和轮播优惠,为特定网址设置最小和最大流量以及重置时间。我需要某种缓存机制吗?

因此,例如,一个用户可能输入的URL http://www.example.com,最低90命中,最大的150和时间,直到1 hour复位。每个小时都会从两者中选择一个数字,并成为该小时的新命中数量。一旦http://www.example.com的点击次数达到一小时之内,http://www.example.com将从列表中删除,直到下一次重置。

总而言之,在页面加载时,至少有3-4个数据库查询在整个不同点进行。

这里是我的问题:

这是可持续发展的大交通量,比如说每小时2,500+请求没有某种形式的缓存机制(这几乎是不可能建立,因为打的需要准确和更新根据请求,所以我不明白在这种情况下如何构建缓存)?

什么是决定这是否可行的变量/因素?

我意识到我的问题有点“iffy”,所以如果你需要的话请确认一下:)!

任何意见,意见,答案将不胜感激!

编辑:

哇,4票接近,但没有人打扰张贴说为什么。我已经提出了一个相关的问题,虽然它可能没有很好地结合在一起,但我想知道它如何不符合SO指导原则。

+1

您可能会尝试张贴这给相关[交流](http://stackexchange.com/sites),而不是IT的一个。 – 2011-10-05 16:19:32

+0

所有信息都是每个请求的唯一信息还是只是匹配的? – Mark

+0

几乎每个请求。可能有一个不是唯一的,保持不变。 – Avicinnian

回答

0

在我看来,信息太少无法决定是否需要缓存。一方面,缓存很少是一个坏主意(在某些情况下,它确实可能很糟糕),另一方面,您可能会认为这不值得开发开销。从我的经验来看,它很大程度上取决于数据的存储方式以及存储在数据库中的方式。如果你有一个单一的表格,你只需要从中获取数据并使用MyISAM表格类型,事情会变得非常快。如果你必须加入并决定使用InnoDB,事情会变得更慢。它也很大程度上取决于你可用的基础设施等等......在我看来,有太多未解决的问题来决定是否需要缓存。

+0

是的,我想可能有很多因素会确定最好的。这将成为一个自我托管的应用程序,这使得这一点有点棘手。我认为最好的方法是告知潜在用户他们需要通过更多流量扩展其资源?这是一个架构已经基本上由我构建的概念,但是如果我有选择的话,我不会从头开始的(我还有其他想法,我愿意为其开发项目) - 因此我宁愿尽可能少的额外开发。 – Avicinnian

1

你可以使用像APC或XCache将保持数据的RAM,你通过一个crontab保存一切每小时

这将是降低负荷,提高网站速度的方法,但它可能会炸毁你的RAM,如果你有太多的数据要保存。 也有数据丢失的风险,如果数据还没有保存,你失去了你的RAM内容

如果你只需要保存+ 1 /每点击/每个网站这将是一个简单的网站阵列观察和点击次数(可能是90和150之间的数字?),在RAM中缓存将是最好的方式来做到这一点

另一种方式是使用文件,这也将比SQL更快,负载比不断发送SQL查询

我希望我能正确理解你的问题

+0

该数字可以是任何范围内的任何数字,因此不是特定的90到150,这是用户可能输入的示例。问题是,需要立即更新命中计数器的+1,因为脚本中的其他数据依赖于以这种方式完成。例如,一个数据库查询会提取所有具有小于最大命中计数器值的计数器值(之前输入的最小值和最大值之间的随机数)。例如,如果它每小时缓存一次,或者甚至通过一定数量的请求(5次请求后更新),它将无法得到正确的最新信息。 – Avicinnian

+0

它不会每小时缓存一次,您只是使用数据库来永久存储您的数据。在你的情况下,你得到了可以存储在RAM或简单文件中的临时数据,你并不需要一个数据库。尽管如此,关闭服务器或类似的东西会导致所有存储数据(如果使用基于RAM的存储)的完全删除,以获得解决方法,以便将数据存储在RAM中的数据每小时(或在更小的间隔,这是你决定的) – DarkDevine

+0

啊我明白了。非常感谢这个主意!我真的应该提到这是一个自我托管的应用程序,所以这种架构实际上不能很好地实现,因为使用这个应用程序的人并不是特别的“以技术为导向”。但是,我会投你的答案,因为它绝对有用。 – Avicinnian

0

可以解决的一个方法是将数据库本身变成缓存。例如,命中数据总量(1小时)为300MB。您可以分配600 MB到DB服务器的IO缓冲区。

这种方式,数据几乎总是被“缓存”在内存中。如果不在系统中添加新组件,这将会提供非常好的性能。当记录新的点击时,该信息将被记录在磁盘上。

但是后续页面点击会经常查询(每小时2500个请求),DB服务器会决定将该行保留在内存中(技术上说,该行包含该行)很长一段时间。

这样,DB服务器本身会执行作业缓存。

如何在PostgreSQL做一些提示:

http://www.postgresql.org/docs/8.2/static/monitoring-stats.html