更好地设计缓存系统

时间:2015-08-03 09:11:32

标签: ruby-on-rails amazon-web-services load-balancing

我要为我的项目创建一个集群。

我混淆了我应该在我的系统上使用哪种策略。

有许多Web App台服务器和database台服务器。

查询需要几秒钟才能完成。

所以我宁愿尽可能多地使用缓存。

群集在AWS上进行自动缩放控制。

那么,我应该将所有缓存放在redis server中并让所有Web应用程序访问它吗?

3 个答案:

答案 0 :(得分:2)

没有银弹可以一劳永逸地解决你的缓存问题。缓存是提高性能的众多技术。

一些最重要的技术是:

  • E-tags (客户端捕获,如果您不需要,请不要创建新的响应 到)。
  • [片段缓存]
  • 在负载均衡器中使用http-accelerator,如SquidVarnish

http://guides.rubyonrails.org/caching_with_rails.html#fragment-caching) - 避免昂贵的渲染操作   - Model caching

实际存储缓存的位置取决于它的缓存类型。

将缓存存储在共享Redis服务器可能会在某些情况下提供更好的性能,因为您访问冷缓存的请求会更少。但是,从缓存服务器扫描跨网站的数据将比单个应用程序服务器上的数据慢。

总是要考虑权衡。

答案 1 :(得分:1)

最大的说法是唯一正确的答案:没有正确答案。

缓存的目的是限制对服务器的可行请求量。 我通常做的事情:

  1. 让回复成为单一责任(真正的REST)。
  2. 允许所有需要新鲜数据的请求(例如个人资料,用户等)
  3. 通过varnish / squid缓存尽可能多的具有过时数据的请求。
  4. 在rails上使用ETags以允许应用程序决定当请求通过varnish / squid缓存时是否需要执行额外的工作。
  5. 尽可能在应用程序上使用Redis / MemCached,以降低获取实时数据的成本。
  6. 再次进行权衡。陈旧数据永远不会100%罚款。缓存是一种无法解决所有问题的绑定。它只能帮助减少损坏(进入服务器的成本)。

答案 2 :(得分:0)

首先,在不知道您的项目有什么类型的请求(即多个用户的共享数据与每个用户都有其独特数据)的情况下,很难对缓存设置提出真实的建议。

如果查询需要多秒才能完成,您是否首先尝试解决此问题并尝试优化它们?甚至可能将MongoDB中的技术转换为常规SQL存储?缓存只会有助于后续调用,而不是第一次调用。

正如其他人所说,在某些情况下,缓存可能有所帮助,但是如果您重复访问相同的访问权限,那么启动并运行并启动rails应用程序的多个实例会增加设置的复杂性并且缓存策略只会有所帮助数据