【问题标题】:ASP.NET MemoryCache Sharing Across Applications跨应用程序的 ASP.NET MemoryCache 共享
【发布时间】:2013-03-09 19:47:11
【问题描述】:

我一直在阅读有关从 .Net Framework 4.0 开始的新 MemoryCache 类的信息。根据我的阅读,您可以跨不同的 .Net 应用程序访问 MemoryCache。我正在尝试在 Asp.Net 应用程序和标准 Windows 窗体 .Net 应用程序之间共享一个对象。如果我将对象添加到 .Net 应用程序中的 MemoryCache,Asp.Net 应用程序看不到它。有没有办法做到这一点?感谢您的宝贵时间,非常感谢。

Windows 窗体应用程序:

    Dim cache As ObjectCache = MemoryCache.Default
    Dim policy As New CacheItemPolicy()
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60)
    cache.Set("testcache", TestObj, policy)

Asp.Net 应用程序:

    Dim cache As ObjectCache = MemoryCache.Default
    If IsNothing(cache("testcache")) Then Response.Write("TestCache Is Nothing")

谢谢 - 瑞恩

【问题讨论】:

    标签: asp.net .net vb.net memorycache system.web.caching


    【解决方案1】:

    不,这是不可能的。 MemoryCache 不是分布式缓存解决方案。所以只能在本地使用。

    如果您正在寻找分布式缓存替代方案,您可能需要查看 AppFabric 或 Redis。

    但是,以这种方式共享缓存听起来确实有点像一个奇怪的架构。 也许公开一个共享服务层,asp.net 和 winforms 都使用,并且只让服务实现缓存似乎更合乎逻辑(考虑到我实际上对您要解决的问题一无所知,所以我可以错误)。

    出于性能原因,缓存更常用,而不是作为在应用程序之间共享数据的一种方式。

    【讨论】:

    • 谢谢巴勃罗。您认为哪些程序对于新手程序员来说更容易?感谢您的宝贵时间。
    • 基本上,我正在使用 Windows 窗体应用程序读取 udp 数据。 asp.net Web 应用程序使用此 udp 数据。数据约为每分钟 100 条消息。为避免 asp.net Web 应用程序的用户通过 odbc 连接拉取数据时出现延迟,我希望共享内存将使 asp.net 应用程序响应更快,因为该应用程序必须一次拉取大量数据库.谢谢!
    • 哦,我明白了。不,你不能像这样在不同的机器之间共享内存。最终,实际数据需要从 winforms 应用程序传输到服务器。您可以做的一件事是在 asp.net 应用程序上创建 WCF 服务。 winforms 应用程序每分钟调用一次该服务,使用这 100 条消息,在服务中,您可以选择将它们添加到本地缓存、将它们存储在数据库中,或两者兼而有之。
    • 有趣。我对 Redis 做了一些研究,学到了很多东西。显然 MySQL 有一个可以从两个应用程序访问的内存表引擎。我让它运行并每秒接收大约 10-20 个插入语句,它只消耗 1% 的 CPU。另一边选择整个数据库,大约1000行,加载时间在50ms左右。我对表演印象深刻。最初,我认为它无法处理每秒 10-20 次插入,但内存引擎表确实执行了。您对这些内存表有任何经验吗?
    • 哦,有趣!不,我从未使用过 mysql 的内存表,我会继续阅读,谢谢! :D。现在,另一个提示:如果您共享的数据是易失性的,也就是说,没有必要长期存储它,但只是为了实时可视化,您可能可以避免存储、数据访问层以及所有这些,一共,只需将数据发送到服务器,并通过静态状态将其保存在内存中(如果您部署了一个 Web 服务器场,则为 Redis)。这样一来,您应该能够每秒处理数百条消息,并且可以立即阅读。
    【解决方案2】:

    MySQL 内存表运行良好并且具有出色的性能。 20/30 插入一秒,CPU 负载仅为 1% 左右。

    【讨论】:

      【解决方案3】:

      我意识到这个建议并不及时,但对于阅读这个问题的其他人来说,另一种可能性是两个程序之间的进程间通信 (IPC)。这样,这两个程序可以直接交换消息/数据,而无需通过中间程序。

      https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574(v=vs.85).aspx

      根据上面的文档,这里有一些选项。

      剪贴板 通讯 数据复制 DDE 文件映射 邮槽 管道 RPC Windows 套接字

      在您的情况下,映射内存文件可能是最好的方法,因为它允许应用程序之间共享内存空间。从根本上说,您的 MySql/Redis 方法可能并没有那么不同。

      【讨论】:

        【解决方案4】:

        如果您有兴趣: 单服务器多个应用程序 - 内存共享 您应该考虑在同一节点上创建 Web api 并使用它(简单的键值 API) 并使用.net框架提供的简单内存缓存

        多台服务器 - 内存共享 免费 $$ 解决方案

        1. 您可以使用“Distributed SQL Server Cache”,允许 分布式缓存以使用 SQL Server 数据库作为其后备存储。 要在 SQL Server 实例中创建 SQL Server 缓存项表, 您可以使用 sql-cache 工具。该工具使用 您指定的名称和架构。

        2. 如果你有一个可以使用的节点集群 NCache 它是 本地开发的开源内存分布式缓存 .NET 和 .NET 核心。 NCache 在本地工作和配置为 在 Azure 中运行的 ASP.NET Core 应用程序的分布式缓存集群 或在其他托管平台上。

        需要付费的解决方案: NCache 前面提到过,有专业和企业解决方案, 要么 Redis Cache - Redis 是一个开源的内存数据存储,通常用作分布式缓存。您可以为 Azure 托管的 ASP.NET Core 应用配置 Azure Redis 缓存,并使用 Azure Redis 缓存进行本地开发。

        【讨论】:

          猜你喜欢
          • 2011-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多