为了好玩我正在写一个fastcgi应用程序。现在,我所做的就是生成GUID并将其显示在页面顶部,然后根据从我现有网站之一提取数据的URL进行数据库查询。
我想尝试在页面上缓存除GUID之外的所有内容。这样做的好方法是什么?我听说但从未使用过redis。但它似乎是一个服务器,这意味着它在一个单独的过程中。也许一个进程中的解决方案会更快? (除非不是吗?)
页面缓存有什么好的解决方案? (我正在使用C ++)
答案 0 :(得分:2)
您的实现听起来像是需要一个简单的键值缓存机制,并且您可以使用C ++ 11中的std::unordered_map
容器或其表达式boost::unordered_map
。 unordered_map
提供哈希表实现。如果您在某些时候需要更高的性能,您还可以查看提供高性能,标准库兼容容器的Boost.Intrusive。
如果您使用上述建议滚动缓存,则第二个问题将是缓存条目到期,因为缓存数据可能会变得陈旧。我不知道您的数据是什么样的,但您可以选择实施任何这样的缓存策略:
多线程/并发访问也可能是一个问题,尽管如上面的链接所示,可能是在访问时锁定缓存而不是担心粒度锁定。
现在,如果您正在讨论扩展,升级到多个流程,以及跨多个物理机分发服务器流程,那么简单的进程内缓存可能就不再适用了(每个人都可能拥有不同的数据副本)在任何给定时间,如果某些服务器缓存了数据但其他服务器没有缓存数据,则性能不一致。)
这就是Redis / Memcached / Membase /等的地方。闪耀 - 它们是为扩展和从数据库卸载工作而构建的。它们可以被性能数据库和内存缓存击败(毕竟还有延迟,以及许多其他因素),但是当涉及到扩展时,它们非常有用并且可以节省数据库的负载,并且可以快速满足要求。它们还具有缓存过期功能(实现方式不同)。
最重要的是?它们易于使用和插入。您不必从一开始就选择redis / memcache,因为缓存本身只是一种优化,您可以快速替换缓存代码,例如使用内存缓存你自己使用redis或其他东西。
缓存服务器之间仍然存在一些差异 - membase和memcache分发他们的数据,而redis有主从复制。
为了记录:我在一家公司工作,我们使用memcached服务器 - 我们在数据中心有几个,其余的服务器都有16 GB的RAM完全分配给缓存。
编辑:
对于速度比较,我会适应很久以前看过的Herb Sutter演示文稿: