在.Net应用中使用内存数据缓存以提高性能

5
我们有一个应用程序(规则引擎),它在内存中有很多表格来执行某些业务规则。这个引擎也用于需要时写回数据库。
DB结构是非正规化的,我们有5个事务性表格,有时还需要查询报告。
问题在于,我们想将数据缓存到应用程序中,以便在应用程序启动时加载,然后仅在DB更改时才进行更改。
有什么建议吗?
我们倾向于创建一个DB服务,处理所有插入、更新和删除,并将它们排队以减少DB服务器的负载(事务表格也有许多索引)。此外,我们考虑使DB服务可以坐在上面,为需要直接DB访问的所有报告/其他应用程序提供服务。
当然,这里的目的是减少每个请求的选择查询的DB击数,并优先处理交易。同时确保访问应用程序的人不会使DB服务器崩溃。
规则引擎是一个C#桌面应用程序,报告和其他应用程序基于Web。
如何最好地解决这个问题?我也想过从我的事务表中删除所有索引,并设置触发器插入到一个新表中,该表是副本,但用于报告检索的索引。

1
你试图解决什么问题?目前的性能瓶颈是什么? - Esteban Araya
痛点如下:
  1. 当从同一张表进行过多的写入/读取时,会出现表锁问题。
  2. 在每个业务交易中检查规则时,数据检索速度较慢,这些规则基于数据库中的其他表,因此每个业务交易可能意味着对5个不同表格的5个不同查询。查询SQL服务器相同的表格只是我想要避免的成本。
  3. 上述#2中提到的数据可能会发生更改,而轮询/数据缓存过期似乎并不“优雅”。
- Faisal M
3个回答

2
你可能应该考虑分布式缓存解决方案(从性能和可扩展性的角度来看)。简而言之,我正在谈论由分布式缓存支持的可扩展的数据库服务(以便多个数据库服务由同一缓存提供服务)。
这里是文章,讨论了包括数据库同步在内的分布式缓存的各种方法。这里是博客文章,列出了.NET中的几个分布式缓存选项。

卓越 - 分布式缓存 - 比拥有数据库服务更有意义...我会研究一下这个。 - Faisal M

1

我曾经使用一个非常复杂的规则引擎做过类似的事情。最终,我将数据集中序列化(设置了一个流程来发布新更改,导致新副本被序列化并存储在某个可访问的位置)。在加载时,每个应用服务器都会检查它们是否拥有最新版本的副本,如果没有,则获取它(并在本地存储)。

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


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

0

你可能会对这篇文章感兴趣。它使用XML来存储数据库的只读副本(在内存中)。并使用XPath进行查询。当然,现在你更喜欢使用LINQ进行查询。


谢谢,但这仍然无法帮助我确定如何在表值更改时更改应用程序(缓存)中的数据集。缓存数据不是真正的问题,问题在于确保最小化选择查询,同时确保数据始终是最新的。 - Faisal M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接