ASP.NET 内存缓存在应用程序之间的共享

6
我已经在各处阅读了关于 .Net Framework 4.0 中新的 MemoryCache 类的文章。从我所读的内容来看,您可以跨不同的 .Net 应用程序访问 MemoryCache。我正在尝试在 Asp.Net 应用程序和标准 Windows Forms .Net 应用程序之间共享一个对象。如果我将该对象添加到 .Net 应用程序中的 MemoryCache 中,则 Asp.Net 应用程序无法看到它。有没有办法实现这一点?谢谢您的时间,非常感谢。
Windows Form 应用程序:
    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")

感谢您-Ryan
4个回答

6
不,那是不可能的。MemoryCache并不是一种分布式缓存解决方案。所以它只能在本地使用。
如果您正在寻找分布式缓存替代方案,可以考虑使用AppFabricRedis
然而,这似乎有点奇怪的架构想要通过共享缓存来实现。也许暴露一个共享服务层,使asp.net和winforms都能够使用,然后只让服务实现缓存似乎更合理(请注意,我对您试图解决的问题一无所知,所以我的说法可能是错误的)。
缓存更常用于性能优化,而不是作为在应用程序之间共享数据的方式。

谢谢你,Pablo。你认为哪一个编程程序对于初学者来说更容易?感谢你的时间。 - wayofthefuture
基本上,我正在使用Windows表单应用程序读取UDP数据。ASP.NET Web应用程序使用此UDP数据。数据大约每分钟100条消息。为了避免使用ODBC连接拉取数据的ASP.NET Web应用程序用户遇到延迟,我希望共享内存可以使ASP.NET应用程序更快地响应,因为该应用程序必须一次性拉取大块数据库。谢谢! - wayofthefuture
哦,我明白了。好吧,不,你不能像这样在不同的机器之间共享内存。最终,实际数据需要从winforms应用程序传输到服务器。你可以做的一件事是,在asp.net应用程序上创建一个WCF服务。winforms应用程序每分钟调用该服务一次,并使用那100个消息,在服务中,你可以选择将它们添加到本地缓存中、存储到数据库中,或两者兼而有之。 - Pablo Romeo
哦,有趣!我从未使用过mysql的内存表,我会去了解一下,谢谢! :D。 现在,另一个提示:如果您共享的数据是易变的,也就是说,没有必要长期存储它,而只是为了实时可视化,您可能可以避免存储、数据访问层等所有这些东西,直接将数据发送到服务器,并通过静态状态(或Redis,如果您部署了一组Web服务器)将其保存在内存中。这样,您应该能够处理每秒超过数百条消息,并且读取它将是即时的。 - Pablo Romeo
是的,可能是一个WCF服务。但是,Winform应用程序已经拥有数据了,它是收集数据的应用程序,不是吗?或者您需要从不同机器上的多个不同的Winform应用程序中汇总信息? - Pablo Romeo
显示剩余2条评论

1

MySQL内存表非常出色,性能卓越。每秒20/30次插入,仅约1%的CPU负载。


1

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

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

从上面的文档中,这里是您的一些选项。
剪贴板 组件对象模型(COM) 数据复制 动态数据交换(DDE) 文件映射 邮槽 管道 远程过程调用(RPC) Windows套接字
在您的情况下,映射内存文件可能是最好的方法,因为它允许应用程序之间共享内存空间。从根本上说,您的MySql/Redis方法可能并没有什么不同。

0

如果你对以下内容感兴趣: 单服务器多应用程序-内存共享 你应该考虑在同一节点创建Web API并消费它(简单的键值API), 并使用.NET框架提供的简单内存缓存。

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

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

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

需要付费的解决方案: 如前所述,有专业版和企业版的NCache, 或者 Redis Cache - Redis是一种开源内存数据存储,通常用作分布式缓存。您可以为Azure托管的ASP.NET Core应用程序配置Azure Redis缓存,并在本地开发中使用Azure Redis缓存。


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