【问题标题】:Cache "dictionary-like" DB entities in ASP.NET MVC app在 ASP.NET MVC 应用程序中缓存“类字典”数据库实体
【发布时间】:2015-06-03 17:03:40
【问题描述】:

我在 Azure 中托管了 asp.net mvc5 项目,该项目使用 SQL Azure 进行数据持久性。我数据库中的一些表就像字典一样,它们被很多表引用,并且很少更改。此类表的一个示例可以是客户端应用类型:Windows、Windows Phone、Android 等。

但是还有更多的数据库插入操作可以将数据插入到对这些 dict 表具有外部引用的表中。 我想优化并且不要在每次我想插入时对字典表进行 SQL 查询以获取某个实体的 id(这不是过早的优化,Azure 可能会根据查询次数改变一些钱)。

实现这一目标的好方法是什么?目前,我有类似 DAO 的实体管理器,其中包含在构造对象或显式调用 Refresh() 时填充的静态字段(当通过我的 asp.net mvc 应用程序更新字典数据时)。每个 Manager 从自己的表中缓存实体。 这就像穷人的缓存。我想知道有没有更好的方法来做到这一点?是否有任何模式/库/技术来缓存“类似字典”的数据?

【问题讨论】:

    标签: c# asp.net-mvc azure caching azure-sql-database


    【解决方案1】:

    既然您在 Azure 中托管应用程序并使用 SQL Azure,那么为什么不使用 Microsoft Azure Redis 缓存。 Redis 是一种高级的键值缓存和存储。

    https://azure.microsoft.com/en-us/services/cache/

    使用方法: https://azure.microsoft.com/en-us/documentation/articles/cache-dotnet-how-to-use-azure-redis-cache/

    【讨论】:

    • 如果你想离开 Azure,你要么需要设置自己的 Redis(如果你的新提供商不提供类似的服务),要么重写缓存代码。并不意味着这是一个糟糕的选择,但要权衡这些因素。
    • Redis 是一流的软件。所以即使你离开 Azure,我怀疑你会从你的架构中删除 Redis。话虽如此,设置 Redis 服务器并不过分复杂,特别是因为它有一个 Windows 端口以及可靠的 Redis 客户端,包括来自 stackexchange 的客户端。我使用过 Service Stack 客户端 - 运行良好。
    • Redis 服务器是架构的另一部分,需要安装、修补、操作,并代表一个额外的故障点。它比 System.Web.Caching.Cache 更复杂。这可能是一个不错的选择,但不应忽视额外的复杂性。
    • 它更复杂,但选择更健壮。鉴于他的应用程序已经在 Azure 上并使用现有服务。为什么不使用它?如果他不使用 Azure,那么我认为其他缓存选项也可以。不过,我仍然建议使用 Redis :)
    • 因为在平台之间迁移代码我已经做了很多努力。我的经验表明,只有在收益超过潜在的未来迁移成本时才锁定特定平台。我无法判断 OP 是否如此。
    【解决方案2】:

    看看System.Web.Caching.Cache

    它提供了良好的缓存框架,并允许多种缓存过期策略。

    您可以使用CacheDependency 控制缓存,它可以简单到必须刷新缓存之前的持续时间,也可以像SqlCacheDependency 一样复杂,它会在基础 SQL 表更改时自动刷新缓存(更复杂设置,但更有效,因为它避免了对缓慢变化的表进行不必要的刷新,并避免了表发生变化时缓存不同步)。

    【讨论】:

    • 看来您可以将 SqlCacheDependency 配置为使用轮询而不是更改通知。自己没试过。 stackoverflow.com/a/17111264/141172
    • SqlCacheDependency 利用 SQL Server 服务代理和查询通知。根据我正在阅读的内容,我认为 Azure 不支持这些。
    • @WilliamXifaras:你看过我上面链接的答案,以及它链接到的 MSDN 文章吗?
    • 请阅读。没有 Service Broker,但它确实支持使用 SqlCacheDependancy 进行轮询。不喜欢这种方法,但它应该可以工作。
    • 请记住,Azure 网站会定期无法进行维护等,Microsoft 建议您至少运行 2 个实例;事实上,如果您只运行一个,他们的 SLA 并不适用。当您使用 System.Web.Caching.Cache 时,它​​在本地实例内存中运行;因此缓存可能在多个实例上不同步。您提到数据很少更改,并且根据应用程序的重要性,您可能不需要正常运行时间保证。但是,最好注意这里提出的 Redis 解决方案是为您将拥有多个 Web 实例的场景设计的。
    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2010-09-14
    • 2011-07-26
    • 2010-09-25
    • 2013-09-27
    • 2011-11-29
    相关资源
    最近更新 更多