服务器上的缓存数据是否会提高性能?

时间:2011-08-19 20:55:26

标签: sql-server wcf performance caching

我有webservice(WCF)和MembershipProvider / RoleProvider来检查凭据。

当服务被调用时 - 各种方法调用提供者来获取用户,通过Id获取登录名,通过登录名获取Id等等。最终结果 - 在查看Profiler时 - 我可以看到很多聊天。

我可以轻松地将缓存合并到MembershipProvider和RoleProvider中,这样它就会缓存用户,并且每次都不会命中DB。

用户列表不大。我认为它不会超过100-200。

一方面 - 我知道SQL Server会缓存小表并设计用于处理这些选择。 OTOH - 我在探查器中看到它:)并且Web服务器端的内存将被占用。另外,仍然需要在Web服务器上进行查找(CPU /内存)。

我想我想听听你的经历,我是否应该担心这些事情?我“战略性地”放置标签,所以希望DBA和开发人员都会给我一些意见:)

5 个答案:

答案 0 :(得分:2)

取决于。如果要删除或禁用用户帐户并使更改立即生效,会发生什么?

您需要确保对用户帐户的所有修改始终反映在所有Web服务器的缓存中。但最终,很有可能避免网络IO(这会让你真正放慢速度)虽然对个人来说不明显,但每次点击数据都会略有不同。

虽然很可能,但这不值得。

答案 1 :(得分:2)

当然,避免往返数据库服务器会有所回报。不仅是内存缓存问题。运行查询,即使是微不足道的查询,也是一个非常复杂的过程:

  • 必须打开并验证连接。它通过连接池进行摊销,为true,但即使是池化连接,在开放时仍需要额外往返sp_reset_connection
  • 请求必须编写并发送到服务器
  • 需要为请求分配任务,并且工作人员必须接收任务。工作人员是SQL Server中非常宝贵的资源,因为有so few of them
  • SQL必须解析您的查询。在最好的情况下,它可以跳过解析但仍需要对输入文本进行哈希处理,请参阅Dynamically created SQL vs Parameters in SQL Server
  • 必须执行
  • 查询,获取锁,查找内存中的页面。锁定特别昂贵,因为它可能与其他操作冲突并且必须等待。使用snapshot isolation可以帮助某些(大)范围。
  • 必须将结果封送回客户端。
  • 客户端必须解析响应元数据。
  • 客户必须处理回复。

本地内存查找将赢得大多数时间。即使像memcached这样的远程缓存查找也会赢得数据库查询,无论查询多么微不足道。那么为什么不总是在本地缓存?由于CS中最棘手的问题之一:缓存一致性和失效。这是一个 way 比你现在想象的更难的问题,不管你认为它有多难;)。您可以查看SQL Server自己的活动缓存失效解决方案Query Notifications,它对于相当静态的结果集非常有效。我自己与Query Notification项目进行了LINQ集成,LinqToCache

答案 2 :(得分:1)

我已经看到这种策略即使对于经常访问的小表也能获得巨大回报。在我们的案例中,我们将数据分发到每个本地Web服务器上的Express实例,并且Web应用程序将查询其本地副本,而不是使用网络资源等来打扰主OLTP服务器。随着您的应用程序的增长并添加更多Web服务器,其优势从读取/写入数据库中获取这么多读取活动和加载会变得更大。

这是一个自定义解决方案,因此我们可以规定每个表的可用性如何,以及推送到主服务器的数据更改是否需要立即分发给客户端,还是可以等到下一个计划的分发。

答案 3 :(得分:1)

我们有一个基于http的服务 - 大量的请求和每个请求都需要进行身份验证(90%非常小的请求,其余的很大)。 即使将数据库放在同一台机器上(24 GB RAM,快速磁盘等),我们也可以通过实现缓存(基于ConcurrentDictionary)将可扩展性提高100% - 从而能够使用同一台机器提供双倍的请求。 / p>

为了对用户/登录等进行更改立即生效,我们实现了一个用于此类内容的Web服务(SOAP),并以“直写方式”维护缓存。

总而言之,我们对缓存非常满意。

答案 4 :(得分:0)

我使用各种ASP.Net提供程序构建了许多大型网站。我已经针对Azure表存储,Oracle,LDAP服务器和各种自定义后端编写了它们。

我个人不会担心规模一段时间。数据库快速可靠。一旦开始缓存这些数据,您就会有许多问题需要担心:

  1. 缓存失效。用户被解雇,您通过带外进程更新数据库。您如何更新您的网络服务器缓存?
  2. 错误。虽然缓存并不难,但编写代码的行数越少越好。
  3. 安全。您可能会忽略安全问题。
  4. 时间。致力于客户功能。这更重要。
  5. 根据需要进行优化。在此之前,添加功能以使您的东西更好。

    如果您担心缩放比例,请将用户/角色表放在与其余数据不同的数据库中。如果您开始超出该服务器,则可以轻松地将用户数据迁移到更大的数据库。