在fastcgi应用程序中缓存的最有效方法

时间:2011-11-09 06:18:19

标签: caching web-applications

为了好玩我正在写一个fastcgi应用程序。现在,我所做的就是生成GUID并将其显示在页面顶部,然后根据从我现有网站之一提取数据的URL进行数据库查询。

我想尝试在页面上缓存除GUID之外的所有内容。这样做的好方法是什么?我听说但从未使用过redis。但它似乎是一个服务器,这意味着它在一个单独的过程中。也许一个进程中的解决方案会更快? (除非不是吗?)

页面缓存有什么好的解决方案? (我正在使用C ++)

1 个答案:

答案 0 :(得分:2)

您的实现听起来像是需要一个简单的键值缓存机制,并且您可以使用C ++ 11中的std::unordered_map容器或其表达式boost::unordered_mapunordered_map提供哈希表实现。如果您在某些时候需要更高的性能,您还可以查看提供高性能,标准库兼容容器的Boost.Intrusive

如果您使用上述建议滚动缓存,则第二个问题将是缓存条目到期,因为缓存数据可能会变得陈旧。我不知道您的数据是什么样的,但您可以选择实施任何这样的缓存策略:

  • 在一定时间/次数之后,使缓存条目失效
  • 在一定时间/使用次数之后,使整个缓存过期(极端)
  • 最近最少使用 - 有关于此问题的堆栈溢出问题:LRU cache design

多线程/并发访问也可能是一个问题,尽管如上面的链接所示,可能是在访问时锁定缓存而不是担心粒度锁定。


现在,如果您正在讨论扩展,升级到多个流程,以及跨多个物理机分发服务器流程,那么简单的进程内缓存可能就不再适用了(每个人都可能拥有不同的数据副本)在任何给定时间,如果某些服务器缓存了数据但其他服务器没有缓存数据,则性能不一致。)

这就是Redis / Memcached / Membase /等的地方。闪耀 - 它们是为扩展和从数据库卸载工作而构建的。它们可以被性能数据库和内存缓存击败(毕竟还有延迟,以及许多其他因素),但是当涉及到扩展时,它们非常有用并且可以节省数据库的负载,并且可以快速满足要求。它们还具有缓存过期功能(实现方式不同)。

最重要的是?它们易于使用和插入。您不必从一开始就选择redis / memcache,因为缓存本身只是一种优化,您可以快速替换缓存代码,例如使用内存缓存你自己使用redis或其他东西。

缓存服务器之间仍然存在一些差异 - membase和memcache分发他们的数据,而redis有主从复制。

为了记录:我在一家公司工作,我们使用memcached服务器 - 我们在数据中心有几个,其余的服务器都有16 GB的RAM完全分配给缓存。

编辑:

对于速度比较,我会适应很久以前看过的Herb Sutter演示文稿:

  • 处理内存 - >真的很快
  • 从本地进程内存数据中获取数据 - >还是很快
  • 来自本地磁盘的数据 - >取决于您的I / O设备,SSD可以很快,但机械驱动器是冰川的
  • 从远程进程获取数据(内存数据) - > fast-ish,你的缓存服务器更接近
  • 从远程进程(磁盘)获取数据 - >冰山