asp.net 中的全局变量和会话

Global variables and sessions in asp.net

我是网络开发的新手,来自 java 和 android 的世界,我有几个问题。 (我正在使用 asp.net)。

  1. 假设我有一个简单的网页,其标签显示了一个数字和一个按钮。当任何用户按下该按钮时,所有查看该站点的用户的数字都会自动递增,即使他们没有刷新页面也是如此。我会使用会话来实现这个还是我应该研究的另一个概念?
  2. 我有 2 种类型的计数器,我使用以下模式存储在 mysql table 中。

Counter_ID Increment_Value

每个计数器在设定的时间内处于活动状态,并且在一个时间点只能有一个计数器实例处于活动状态。这段时间之后,计数器将重置为 0,并创建一个新的计数器实例。我使用此模式将所有活动的实例以及过去的实例存储在 table 中。

Instance_ID Counter_ID Counter_Value Status(Active/Complete) Time_Remaining

当用户打开专用于两种计数器类型之一的页面时,需要加载有关该计数器当前 运行 实例的信息。我是否只执行一个 SQL 查询来实现此目的并在每次加载计数器页面时读取活动计数器的信息,或者是否有一种方法可以将此信息存储在站点上以便站点 "knows" 哪个实例当前处于活动状态并且不需要对每个请求进行 SQL 查询(使用全局变量概念)?显然,上述情况只是我用来解释我的问题的简化示例。

您可以使用 ApplicationState 来缓存非用户特定的全局值。在您的第一个示例中,由于所有用户的数字都会增加,因此您可以在每次增加时以事务方式将其存储在数据库中,并将其缓存在 ApplicationState 中,以便在服务器上呈现页面时可以快速读取它。您必须小心确保正确处理并发,以便每次递增数字时,数据库和缓存都会自动更新。

你的问题有点不清楚,但如果你的要求是同时向所有当前使用你网站的用户实时发布对数字的更改,你会需要看实时技术。 Websockets 对此很有用(如果在服务器和客户端浏览器上可用)。具体来说,在 .NET 平台上 SignalR 是实现从服务器到客户端的实时通信的好方法,并且在不支持 WebSockets 的情况下可以优雅地回退。

需要说明的是,您不会在这种情况下使用会话存储(除非我误解了您的问题)。会话是针对每个用户的,通常不应影响系统中的其他用户。您的示例都是关于全局值的,因此 Session 在这种情况下不是正确的选择。

对于您的第二个示例,使用 ApplicationState 和事务性数据库提交,您应该能够缓存当前处于活动状态的计数器并随意切换它们,前提是您在执行它们之间的切换时锁定所有资源。

希望这些信息足以让您朝着正确的方向前进。