Session 如何在Web服务器端实现会话超时?

Session 如何在Web服务器端实现会话超时?,session,Session,我看到一个web框架以这种方式实现内存会话。会话对象添加到缓存时超时。超时后,会话将自动从缓存中删除。为了保护竞争条件,每个请求都应该获得给定会话对象的锁才能继续。每个请求将“触摸”缓存中的会话以刷新超时 在发现这种情况之前,一切看起来都很好。比如说,一个操作需要很长时间,比超时时间长。另一个请求出现并等待会话锁,该会话锁当前由长时间请求持有。最后,长时间请求结束,释放锁。但是,由于它所花费的时间已经超过超时时间,会话对象已经从缓存中删除。这是显而易见的,因为持有锁的唯一请求没有机会“触摸缓存中

我看到一个web框架以这种方式实现内存会话。会话对象添加到缓存时超时。超时后,会话将自动从缓存中删除。为了保护竞争条件,每个请求都应该获得给定会话对象的锁才能继续。每个请求将“触摸”缓存中的会话以刷新超时

在发现这种情况之前,一切看起来都很好。比如说,一个操作需要很长时间,比超时时间长。另一个请求出现并等待会话锁,该会话锁当前由长时间请求持有。最后,长时间请求结束,释放锁。但是,由于它所花费的时间已经超过超时时间,会话对象已经从缓存中删除。这是显而易见的,因为持有锁的唯一请求没有机会“触摸缓存中的会话对象”。第二个请求获得锁,但无法检索过期的会话对象。哎呀

要解决此问题,第二个请求必须重新创建会话对象。但是,这就像从坟墓里挖出一具埋在地下的尸体,试图让它复活一样。它会导致错误代码

我想知道在会话中实现超时以处理这种情况的最佳方法是什么。我知道当前平台必须有良好的会话机制。我只想知道幕后是怎么回事。

嗨,摩根·郑(香港人?)

当您的长时间请求完成时,触摸会话对象可以解决您的问题吗

让我们通过一个例子来讨论解决方案。当请求到达时,您触摸会话并将其延长5分钟。当请求结束时,您还可以触摸会话并将其延长1分钟,然后再释放锁。如果“结束请求+1分钟”的结果早于“开始请求+5分钟”,则使用后者作为超时;否则使用前者。(当然,5分钟和1分钟可以是您喜欢的任何值。)

我想知道你在用什么样的“缓存”。根据您的描述,缓存似乎“自动”销毁会话对象。如果是这种情况,当请求到达时,您可以用非常大的超时值触摸会话,例如一天。当请求结束时,您可以使用合理的值(例如,5分钟)重新触摸它。或者,为了更聪明,使用以下值:
(5分钟-请求时间>1分钟)?(5分钟-请求时间):1分钟)
,其中
请求时间
是在请求上花费的时间

希望这有帮助

明治华硕


(来自香港)

首先,我不会在缓存中做任何与会话相关的事情。若会话需要在不使用这么多分钟的情况下自行终止,我将在会话中跟踪所有这些。其次,我倾向于在对会话的访问周围放置一个包装类,以便在访问或触摸任何值时,可以封装用于确定是否应该终止自身的标记(该标记本身可以存储在会话中)以及“终止会话”的代码

你问的是ASP.Net吗?你问到我:)web框架在ASP.Net中,但不使用ASP.Net会话。我只是想要一个普遍的解决方案。所以,我在最初的问题中并没有提到ASP.NET。您建议的第二个解决方案应该可以做到这一点。在开始时将过期日期设置为较长的将来,然后在请求处理结束时将其设置回5分钟。“缓存”的工作方式与ASP.NET缓存类似。插入一个对象时,可以指定超时。当时间到了,缓存将在线程池中安排一个线程来释放对象。你说得对。有缓存来存储会话对象是一个很大的设计缺陷。它限制会话只能存储在内存中,导致可伸缩性问题。