我想每个用户使用5个会话变量。我知道如果我使用inproc模式存储这些变量,它肯定会影响性能,因为我有共享服务器。
但是我使用SQL Server来存储我的会话变量。所以它会在性能上过载。
因为如果我在会话中存储变量,我的连接将会非常简化,并且会保存一次命中数据。
答案 0 :(得分:1)
为什么不只有一个?你说你正在为用户使用,我想每个用户都有一个唯一的ID ...我的意思是只使用一个会话,就像那个唯一的id一样。 (也许您允许使用该电子邮件或具有相同名称的多帐户使用更多帐户,但该ID肯定是唯一的!)。
答案 1 :(得分:0)
我想说"是",但这取决于你想要实现的目标。我已经阅读了很多关于这个主题的有才华的开发者博客,因为我继承了大量会话的旧应用程序。
我为每个用户创建一个具有唯一ID(guid)的会话,该会话用作我的MemoryCache的密钥。在用户通过身份验证后创建guid。如果空闲,会话默认在15分钟后过期,缓存在20分钟后到期。为活跃用户处理续订。缓存的一个好处是它迫使开发人员创建干净的代码(检查和平衡),而许多会话可以帮助创建意大利面条代码。
在我的BaseController中,我有一个方法,它使用guid来获取该用户在缓存中保存的所有信息。这是一个示例,并不是所有代码:
LoginController (摘录)
userCache.UniqueID = GuidUtil.GenerateGuid()
userCache.UserSiteCount = userSitesList.Count
userCache.UserID = user.UserID
userCache.UserName = user.UserName
_registeredUserService.AddUserToCache(userCache)
Session("UserKey") = userCache.UniqueID
<强> BaseController 强>
Private Function CheckAuthentication() As Boolean
If Not Session("UserKey") Is Nothing Then
Return True
End If
Return False
End Function
Private Function GetUserKey() As String
Return Session("UserKey").ToString()
End Function
Protected ReadOnly Property GetUserInfo() As UserCache
Get
Return If(CheckAuthentication(), LoadUserInfo(), Nothing)
End Get
End Property
Private Function LoadUserInfo() As UserCache
Dim cachedUser = _registeredUserService.GetUserFromCache(GetUserKey())
Return cachedUser
End Function
AllOtherControllers (摘录)
Dim viewModel As New ChooseSiteViewModel
viewModel.UserSites = _registeredUserService.GetUserSites(GetUserInfo.UserID)
Return View(viewModel)
<强> ServiceLevel 强>
Function GetUserFromCache(ByVal uniqueKey As String) As UserCache _
Implements IRegisteredUserService.GetUserFromCache
Dim userKey = String.Concat(CacheKeys.User.Main, uniqueKey)
Return _cacheService.[Get](Of UserCache)(userKey)
End Function