【发布时间】:2014-07-19 23:56:27
【问题描述】:
我最近一直在为 ASP.Net 使用不同的会话状态提供程序,并提出了看起来最好的方法(性能和实现方面)。
使用https://github.com/TheCloudlessSky/Harbour.RedisSessionStateStore
这非常有效,而且实现起来非常简单。唯一的问题是它强制请求锁定 - 因此如果有请求打开,浏览器必须等待。这在很多时候都很好,但是当你结束某个长时间运行的进程并且用户想要放弃时,用户会一直挂起,直到长时间运行的进程完成。
现在 - 这可以通过从提供程序中删除锁定来解决。这很容易将 lock = true 的行更改为 lock = false,并更改更新,因此它不会注意到“&& state.Locked && state.LockId == lockId”
恐慌!显然,这违背了会话状态的意图,并且就线程安全而言,这是一个可怕的前景。但是......在我们建立的许多网站中,会话状态很少用于比“哪个用户 id 当前处于活动状态”更复杂的事情——这很少被写入。它可用于在 2 页之间传输(大)数据,也可用于存储奇数设置。 ...在很多情况下,线程安全很少会成为问题,那么性能折衷是否真的值得,或者是取消锁定并冒险获得一个响应速度更快的网站值得冒险?
【问题讨论】:
标签: asp.net session redis thread-safety session-state