为了提高聊天应用程序的速度,我记得静态变量中的最后一条消息ID(实际上是字典)。
然而,似乎每个线程都有自己的副本,因为用户没有获得生产更新(单一服务器环境)。
private static Dictionary<long, MemoryChatRoom> _chatRooms = new Dictionary<long, MemoryChatRoom>();
没有使用stepstaticattribute ...
在所有应用程序流程中分享少量整数的快速方法是什么?
更新
我知道网络必须是无国籍的。但是,对于每个规则都有例外。目前所有数据都以ms sql为单位,在这种特殊情况下,某些共享内存将大大提高性能,并且可以避免sql请求。
我多年没有使用静态,所以我甚至错过了在同一个应用程序中开始出现多个实例的时刻。
那么,问题是在进程之间共享内存对象的最简单方法是什么?目前,我的解决方法是远程处理,但是有很多额外的代码,我对这种方法的稳定性并不是100%肯定。
答案 0 :(得分:2)
我假设你是网络编程的新手。 Web应用程序与常规控制台或Windows窗体应用程序的主要区别之一是无状态。这意味着每个页面请求基本上都是从头开始初始化的。您正在使用数据库来维护状态,但是当您发现这是相当慢的时候。幸运的是,你还有其他选择。
如果您想记住每个用户经常访问的内容(比如用户名),那么您可以使用会话。我建议阅读会话状态here。但是,请注意不要滥用会话对象 - 因为每个用户都有自己的会话副本,它可以轻松地使用大量RAM并导致比数据库更多的性能问题。
如果要缓存与应用程序的所有用户相关的信息,ASP.NET会提供framework for data caching。使用它的最简单方法就像字典,例如:
Cache["item"] = "Some cached data";
我建议详细阅读ASP.NET here中缓存的各种选项。
总的来说,我建议您在使用网络编程之前不要轻易进行缓存。与任何类型的全局共享数据一样,它可能导致不可预测的问题,如果误用则难以诊断。
答案 1 :(得分:1)
到目前为止,没有简单的方法可以在进程之间进行通信。 (也许这可以基于隔离,缩放来实现)。例如,这里明确提到:ASP.Net static objects
如果您真的需要Web应用程序/服务来记住内存中的某些状态,而不是数据库中有以下选项:
您可以将Max Processes count = 1.要求将此段代码移动到单独的Web应用程序。如果您将其设为单独的子域,则从JS访问时会出现跨站点脚本问题。
远程处理/ WCF - 您可以在远程应用程序中托管关键数据,并从Web应用程序访问它。
在每个进程中存储数据,并通过memcached同步更改。 Memcached没有实际数据,因为它需要很长的时间来传输它。每个集合仅上次更改日期。
使用#3,我可以从单台服务器获得每秒超过100页的内容。