【问题标题】:Syncing of memory and database objects upon changes in objects in memory在内存中的对象发生变化时同步内存和数据库对象
【发布时间】:2021-02-10 16:58:49
【问题描述】:

我目前正在使用实体框架在 .net core(C#) 中实现一个 Web 应用程序。在做这个项目时,我实际上遇到了很多挑战,但我将从我认为最重要的一个开始。我的问题如下:

  1. 我没有频繁地从数据库加载数据,而是拥有一组静态对象,它们是数据库中数据的镜像。但是,当我想确保任何更改(即添加/删除/修改对象)实时保存到数据库时,这很乏味且容易出错。有没有什么好的例子或建议可供我参考以改进我的方法?

  2. 另一件事是某些对象的属性值将根据其他一些对象的属性值动态更改。如果公式所引用的单元格中的值发生更改,则类似于电子表格的单元格的值将自动更改。我还没有解决方案来做到这一点。感谢有人有任何我可以参考的例子。但这会增加另一层复杂性,以便将内存中对象的更改同步到数据库。

目前,我不确定是否有更好的方法。感谢是否有人可以提供帮助。谢谢!

【问题讨论】:

  • 对我来说听起来就像你已经建立了一个数据上下文,它在 dbcontext 周围缓存 db 对象,实际上它已经是一个运行良好的数据上下文,可以缓存 db 对象并实现跟踪,也许你应该阅读基础知识的 ef
  • 我同意 - 听起来你在设计这个。使用 EF 的本机内置功能读取和写入数据的实际问题是什么?
  • @PatrickBeynio 我试图实现将对象放入内存是因为性能。我将面临的一个简单场景如下:我有 1 个对象 A 实例、100 个对象 B 实例和 1000 个对象 C 实例。在对象 AI 中有一个属性,如果对象 C 的属性值的子集将自动重新计算变化。我预计会有很多繁重的计算,因此我想在内存中进行。关于保存到数据库,如果不是“实时”也没关系,但我需要数据是持久性的,以防服务器崩溃/错误
  • @Nick.McDermaid 嗨,尼克,请参考我上面的评论。谢谢。

标签: asp.net-mvc .net-core entity-framework-core


【解决方案1】:

基本上,您面临一个称为最终一致性的问题。有些事情发生了变化,两个或更多系统需要同时意识到。这里的问题是需要应用这两个更改才能认为操作成功。如果其中任何一个失败,您需要知道。

在您的情况下,我会使用 Azure 服务总线。您可以创建队列并将消息放入队列中。 Azure 函数将处理这些队列消息。您将创建两个队列,一个用于数据库更新,一个用于内存更新(我认为将其更改为缓存服务可能需要考虑)。现在这些队列的优点是您可以从任何地方轻松地将消息放到这些队列上。因为您提到对象将要发展,您可能需要在数据库或内存(缓存)中更新这些对象。

完成此操作后,我将创建一个包含两个订阅的主题。一个将消息转发到队列 1,另一个转发到队列 2。这将解决您的主要问题。如果对象发生变化,只需将其发送到主题。两种更改(数据库和内存)都将自动执行。

您现在唯一遇到的问题是,您提到要实时更新数据库。在这种情况下,您将不得不离开它。

此外,您需要确保为队列设置了适当的警报,以便万一您确实错过了一条消息,或者您的函数处理得不够好,您将收到一条警报以检查和纠正错误.

【讨论】:

  • 有趣的观点。我从未想过将它们分成两个独立的进程/系统。让我多考虑一下这种方法。谢谢!
【解决方案2】:

我完全同意@nineedm 的回答,但也有其他解决方案。

如果你引入缓存,你总是会面临缓存重新验证的问题——你必须在数据改变时将缓存标记为无效。有时这很容易,具体取决于缓存数据的性质以及数据更改的频率。

如果您只有一个应用程序,MemoryCache 通过适当的指定过期选项就足够了。 如果有集群 - 您必须查看分布式缓存解决方案,例如 Redis。有关于那个Distributed caching in ASP.NET Core的MS文章@

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2023-04-05
    • 2018-05-06
    • 1970-01-01
    • 2011-02-12
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多