问题背景:我正在寻找为我的网站实施缓存系统。目前我们正在探索memcache作为这样做的一种方式。但是,我希望看看SQL Server是否存在类似的东西。我知道MySQL有查询缓存虽然不是分布式的,但它可以作为一种“停止间隙”措施。 MySQL查询缓存是否等同于SQL Server中的缓冲区缓存?
所以这是我的问题:
谢谢!
答案 0 :(得分:4)
自System R显示方式以来,SQL Server实现了一个缓冲池,与太阳下的每个数据库产品(或多或少)相同。血腥的细节在Transaction Processing: Concepts and Techniques中解释。我还添加了一个缓存框架,它由过程缓存,权限令牌缓存和许多其他缓存类使用。该框架在Clock Hands - what are they for。
中有最好的描述但这并不是那种通常感兴趣的缓存应用程序。内部数据库缓存非常适合扩展方案,其中更强大的后端数据库能够通过使用这些缓存更快地响应更多查询,但是现代应用程序堆栈倾向于扩展Web服务器,真正的问题是在Web场使用的缓存中缓存查询interogations的结果。理想情况下,应该共享和分发此缓存。 Memcached和Velocity是此类应用程序缓存基础结构的示例。 Memcache目前已有很长的历史,它的用途和缺点是可以理解的,有很多关于如何使用它,部署,管理和监控它的技术诀窍。
应用程序层中缓存的最大问题,特别是分布式缓存,是缓存失效。如何检测后端数据中发生的更改并将缓存的条目标记为无效,以便新请求不会使用陈旧数据。
最简单的(对于简单的某些定义......)替代方案是来自应用程序的主动失效。代码知道它何时更改数据库中的实体,并且在更改发生后,需要额外的步骤来标记缓存的条目无效。这有几个简短的消息:
更复杂的替代方法是在发生更改时由数据库本身通知的缓存。虽然没有多少技术支持这一点,但如果没有数据库的积极支持,它就无法运行。 SQL Server具有针对此类方案的查询通知,您可以在The Mysterious Notification阅读有关它的更多信息。在独立应用程序中实现基于QN的缓存相当复杂(并且经常做得很糟糕)但是在正确实现时它可以正常工作。在像Memcached这样的共享扩展缓存中这样做是非常强大的功能,但是可行。
答案 1 :(得分:3)
奈,
您的问题的答案如下:
来自Wiki - Always correct... ? :-)。有关Microsoft的答案,请参阅Buffer Cache。
缓冲管理
SQL Server将RAM中的页面缓冲到 最小化光盘I / O.任何8 KB的页面都可以 在内存中缓冲,并设置 调用当前缓冲的所有页面 缓冲区缓存。记忆量 可用于SQL Server决定如何 许多页面将缓存在内存中。 缓冲区缓存由。管理 缓冲管理器。阅读或 写入任何页面将其复制到 缓冲区缓存。随后的读取或 写入被重定向到内存中 复制,而不是光盘版本。 该页面由光盘更新 缓冲区管理器仅在内存中 某些人没有引用缓存 时间。在写页面的同时 光盘,使用异步I / O. I / O操作在a中完成 其他的后台线程 操作不必等待 I / O操作完成。每一页 与其校验和一起写 什么时候写的。在阅读时 页面返回,计算其校验和 再次与存储相匹配 版本,以确保页面没有 被破坏或被篡改 其间。
对于这个答案,请参考上面的答案:
从任何页面读取或写入都会将其复制到缓冲区缓存中。后续读取或写入将重定向到内存中的副本,而不是光盘版本。
您可以查询bpool_commit_target
目录视图中的bpool_committed
和sys.dm_os_sys_info
列,以返回作为内存目标保留的页数和当前提交的页数缓冲区缓存,分别为。
我觉得微软有时间为他们的产品找出缓存,应该值得信任。
我希望这些信息有用,
答案 2 :(得分:0)
您正在谈论的缓存是数据库级缓存,这对您的应用程序来说几乎是透明的。此级别的缓存将包括缓冲池,语句缓存等。确保您的数据库服务器有足够的RAM。理论上,DB服务器应该能够将整个DB存储加载到内存中。除非您在启动应用程序时预先获取某些预期数据并确保它位于数据库缓存中,否则您无法在此级别执行任何操作。
另一方面是内存分布式缓存系统。除了memcache和velocity之外,您还可以查看一些商业解决方案,例如NCache或Oracle Coherence。我没有任何经验可以推荐。这种级别的缓存有望以更低的成本实现可扩展性。与此相比,扩展DB层的成本很高。您可能必须考虑网络带宽等方面。这种类型的缓存,特别是失效和到期可能很复杂
您可以使用IIS级别(在IIS 7中)和ASP.Net级别的输出缓存来缓存Web服务层 在应用程序级别,您可以使用ASP.Net缓存。这是你可以控制最多的,给你带来好处的。
然后在客户端Web代理层上进行缓存,可以通过缓存控制HTTP头控制。
最后,您拥有浏览器级缓存,查看状态和小数据的Cookie。
不要忘记像SAN这样的硬件也会在物理磁盘访问级别缓存。
总之,缓存可以在多个级别进行,您可以为您的方案分析和实施最佳解决方案。您已经发现数据的稳定性和波动性,预期负载等。我相信ASP.Net级别的缓存(特别是对象)可以为您提供最大的灵活性和控制。
答案 3 :(得分:0)
关于SQL Server的缓冲区缓存的具体技术问题在“为我的网站实现缓存系统”方面走错了路。
当然,SQL Server将缓存数据,以便它可以提高性能(并且它也能很好地完成),但是在Web前端实现缓存层的目的是避免与之交谈数据库根本 - 因为即使您的查询完全从SQL Server的缓存中完成,仍然存在开销和资源争用。
你想要研究的是:memcached,Velocity,ASP.NET Cache,P& P Caching Application Block等。