【问题标题】:In Memory Data Cache for Performance in .Net Applications内存数据缓存以提高 .Net 应用程序的性能
【发布时间】:2011-04-04 02:27:31
【问题描述】:

我们有一个应用程序(规则引擎),它在内存中有很多表来执行某些业务规则。该引擎还用于在需要时回写数据库。

数据库结构是非规范化的,我们有 5 个事务表,有时也需要查询这些表以进行报告。

这里的问题是,我们想在应用程序中缓存数据,所以它在应用程序启动时加载,然后只有在数据库发生变化时才会改变。

有什么建议吗?

我们倾向于创建一个数据库服务,它将处理所有插入、更新和删除,并将它们排队以减少数据库服务器上的负载(事务表也有大量索引)。此外,我们正在考虑让 DB 服务位于顶部并为所有需要直接 DB 访问的报告/其他应用程序提供服务。

这里的目的当然是减少每个请求的 Select 查询的 DB 命中率,并确定事务的优先级。还要确保访问应用程序的人不会关闭数据库服务器。

Rules Engine 是一个 C# 桌面应用,报告和其他应用都是基于网络的。

解决此问题的最佳方法是什么?我还考虑过从我的事务表中删除所有索引,并将触发器插入到一个新表中,该表将是一个副本,但为报告检索编制了索引。

【问题讨论】:

  • 您要解决的问题是什么?当前的性能痛点是什么?
  • 绘制点是: 1. Table Lock 问题,同一张表的写入/读取次数过多。 2. 每个业务事务检查规则时数据检索缓慢,规则基于数据库中的其他表,因此每个业务事务,这可能意味着对 5 个不同的表进行 5 个不同的选择查询。为相同的表查询 SQL 服务器只是我想避免的成本。 3.上面#2中提到的数据可能会发生变化,轮询/数据缓存到期似乎并不“优雅”

标签: c# .net linq linq-to-sql msmq


【解决方案1】:

我用一个极其复杂的规则引擎做了类似的事情。最终,我将其设置为集中序列化数据(通过发布新更改的过程,导致序列化新副本并将 blob 存储在可访问的位置)。在加载期间,每个应用服务器都会检查它们是否具有最新版本的 blob,如果没有,则获取它(并将其存储在本地)。

然后它所要做的就是将数据反序列化到内存中。没有 db 命中,除了偶尔抓取新的 blob。这也意味着应用服务器可以在数据库服务器离线时工作(只要它有 blob 的缓存副本)。当然,它还在运行时定期轮询是否有新的更新 - 但仅限于“是否有新的 blob”代码(它仍然不需要访问主表)。

【讨论】:

  • 这是一种可能性,也可以通过在表更改上编写带时间戳的文件以及可能的其他方式,但整个想法根本不是轮询。一种方法可能是,使用时间戳写入文件的触发器,仅在文件上的时间戳更改时才加载数据。因此,对于规则引擎引用的每个表,我只需创建一个 0B 文件,并检查代码中的文件名以加载更改,尽管这仍然不是很优雅。我希望 SQL Server 或 .net 有某种方式让我知道表值已更改。缓存真的不是问题。
【解决方案2】:

您可能对this article 感兴趣,它使用 xml 来存储数据库的只读副本(在内存中)。和 XPath 进行查询。当然,现在您更喜欢使用 linq 进行查询。

【讨论】:

  • 谢谢 - 但这仍然不能帮助我确定在更改表值时如何更改应用程序内的数据集(缓存)。缓存数据不是真正的问题,问题在于确保最少的选择查询,但确保数据始终是最新的。
【解决方案3】:

您或许应该看看分布式缓存解决方案(从性能和可扩展性的角度来看)。简而言之,我正在研究由分布式缓存支持的可扩展数据库服务(以便多个数据库服务由同一个缓存提供服务)。

这里是article,它讨论了分布式缓存,包括用于数据库同步的各种方法。这是blog 帖子,其中列出了 .NET 中用于分布式缓存的一些选项。

【讨论】:

  • 优秀 - 分布式缓存 - 比拥有数据库服务更有意义......我会研究这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多