sql-server-2005 - SQL Server 2005、缓存和所有爵士乐

标签 sql-server-2005 caching distributed-caching

问题背景:我想为我的网站实现一个缓存系统。目前,我们正在探索使用内存缓存来实现这一点。但是,我正在查看 SQL Server 是否存在类似的东西。我知道 MySQL 有查询缓存,虽然它不是分布式的,但可以作为一种“权宜之计”的措施。 MySQL查询缓存是否等同于SQL Server中的缓冲区缓存?

所以这是我的问题:

  1. 有没有办法知道当前存储在缓冲区缓存中?
  2. 跟进这个,有没有办法强制某些表或结果集进入缓存
  3. 我对缓冲区和过程缓存中发生的事情有多少控制权?我知道曾经有一个 DBCC PINTABLE 命令,但此后已停用。
  4. 稍微偏离主题:缓存是否应该存在于数据库层?或者使用 Velocity/Memcache 管理缓存更谨慎?是这样,为什么?在处理具有重叠触发器的许多对象时,缓存失效似乎是一件痛苦的事情。

谢谢!

最佳答案

System R 以来,SQL Server 以与太阳下的每个数据库产品(或多或少)相同的方式实现缓冲池。指明了方向。血淋淋的细节在 Transaction Processing: Concepts and Techniques 中解释。 .我还添加了一个由过程缓存、权限 token 缓存和许多其他缓存类使用的缓存框架。此框架在 Clock Hands - what are they for 中有最好的描述。 .

但这不是缓存应用程序通常感兴趣的类型。内部数据库缓存非常适合扩展场景,更强大的后端数据库能够通过使用这些缓存更快地响应更多查询,但是现代应用程序堆栈倾向于横向扩展 Web 服务器,真正的问题是在 Web 场使用的缓存中缓存查询查询的结果。理想情况下,这个缓存应该是共享和分布式的。 Memcached 和 Velocity 是此类应用程序缓存基础架构的示例。 Memcache 至今已有很长的历史,它的用途和缺点已为人所知,关于如何使用它、部署它、管理它和监控它的知识也很丰富。

应用层缓存的最大问题,尤其是分布式缓存,是缓存失效。如何检测后端数据中发生的更改并将缓存的条目标记为无效,以便新请求不使用陈旧数据。

最简单的(对于一些简单的定义...)替代方案是应用程序主动失效。代码知道它何时更改数据库中的实体,并且在更改发生后采取额外步骤将缓存的条目标记为无效。这有几个短消息:

  • 很难准确知道哪些缓存条目要失效。依赖关系可能非常复杂,事情总是不仅仅是一个简单的表/条目,还有聚合查询、连接、分区数据等。
  • 需要代码纪律来确保修改数据的所有路径也会使缓存失效。
  • 未检测到发生在应用程序范围之外的数据更改。在实践中,总是会在应用程序范围之外发生变化:使用相同数据的其他应用程序、导入/导出和 ETL 作业、人工干预等。

一个更复杂的替代方案是在发生更改时由数据库本身通知的缓存。虽然支持这一点的技术并不多,但如果没有数据库的积极支持,它就无法工作。 SQL Server 有针对此类情况的查询通知,您可以在 The Mysterious Notification 阅读更多相关信息.在独立应用程序中实现基于 QN 的缓存相当复杂(而且通常做得很糟糕),但如果正确实现,它会工作得很好。在像 Memcached 这样的共享横向扩展缓存中这样做是一项了不起的壮举,但也是可行的。

关于sql-server-2005 - SQL Server 2005、缓存和所有爵士乐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1714622/

相关文章:

sql-server - 创建附加全文目录的指南

sql-server-2005 - 创建一个没有列的表

caching - 缓存大小和 block 大小是多少?

redis - 实时分析处理系统设计

java - Ehcache - 使用 RMI 的复制缓存

c# - 来自存储过程的模式

sql-server - 如何在 T-SQL 中聚合字符串数据

android - 临时缓存 map 的一部分(MapView)

Java web app : Force browser to load static content (js, css, html) 如果部署文件改变

sql-server - 分布式二级缓存与专注于调优数据库相比有何优缺点