提问人:Pranav Kumar 提问时间:4/14/2017 更新时间:4/16/2017 访问量:727
一旦会话(在进程中)在 ASP.Net 中超时,如何删除“用户特定的数据缓存”?
How to remove the "user specific data-cache" once the session(In Proc) gets timeout in ASP.Net?
问:
我们将会话超时设置为 1 小时:
<system.web>
<sessionState mode="InProc" timeout="60"/>
</system.web>
它按预期工作。
与“会话”一起,我们创建用户特定的数据缓存来重用数据。
我们为每个登录用户使用唯一的缓存密钥:
var studentId = GetStudentIdFromRequest();
var cacheKey = "SyllabusInfoCacheKey_" + studentId;
我们将缓存的过期时间设置为:
Cache.Insert("MyKey", myObject, null, DateTime.Today.AddDays(1), TimeSpan.Zero);
但是一旦会话超时,我需要删除用户特定的数据缓存。
请帮帮我。
答:
1赞
Boney
4/14/2017
#1
如果您希望缓存中的数据与会话同步,我建议更改方法,即将数据存储在会话本身而不是缓存中。您的要求将自动得到满足。
PS:在您之前的问题中,我建议使用缓存方法,因为您想使用缓存而不是会话。但它看起来像用例,最适合会话使用而不是缓存。 如果您发现会话方法有任何问题,请发表评论。
评论
0赞
Pranav Kumar
4/14/2017
Session 非常适合特定于用户的数据,但建议保持非常小,并再次坚持使用主要数据类型,如整数和字符串。但是我需要将“数据表”存储在我的“用例”中。这就是为什么,我想使用“缓存”。如果我走错了路,请澄清一下。提前致谢!
0赞
Boney
4/14/2017
除非您有该级别的性能要求,否则我认为使用 Session 没有任何问题,特别是因为您的要求指向 Session 使用的方向。也许您可以在 Session 和 Cache 之间进行性能比较,但我可以向您保证,我们已经使用 Session 来存储大型对象。
0赞
Pranav Kumar
4/14/2017
我不确定 Boney,如何实时比较“会话”和“缓存”之间的性能。我浏览了几篇博客,然后把自己指向了 Cache。.如果您建议“如何实时比较'会话'和'缓存'之间的性能”,这将非常有帮助。请分享任何博客/文档。提前致谢!
0赞
Boney
4/15/2017
我的意思是使用秒表之类的东西。不确定与单个用户进行测试是否会有任何大的差异。无论如何,你可以试一试。您可以参考此链接:stackoverflow.com/questions/969290/...
1赞
Rajan
4/14/2017
#2
请尝试以下操作。
将以下代码放在项目的 Global.asax 文件中。
Shared Dict As New Dictionary(Of String, String)
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Code that runs on application startup
Application.Add("AllSession", Dict)
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' Code that runs when a session ends.
' Note: The Session_End event is raised only when the sessionstate mode
' is set to InProc in the Web.config file. If session mode is set to StateServer
' or SQLServer, the event is not raised.
If Dict.ContainsKey(Me.Session.SessionID) Then
HttpRuntime.Cache.Remove(Dict.Item(Me.Session.SessionID))
Dict.Remove(Me.Session.SessionID)
Application.Add("AllSession", Dict)
End If
End Sub
请将此代码放在您要分配会话的 vb 文件中。
Dim cacheKey As New Random
Dim DictcacheKey As Dictionary(Of String, String)
DictcacheKey = Application("AllSession")
If Not DictcacheKey.ContainsKey(HttpContext.Current.Session.SessionID) Then
DictcacheKey.Add(HttpContext.Current.Session.SessionID, cacheKey.Next())
Application.Add("AllSession", DictcacheKey)
Cache.Insert(cacheKey.Next(), DictcacheKey, Nothing, DateTime.Today.AddDays(1), TimeSpan.Zero)
End If
注意:如果您不使用 vb,请在 C# 中转换此代码。
评论
0赞
Boney
4/14/2017
但是,除非有一些缓存密钥存储库,否则他将如何在此处获取所有键值。代码中的不同位置可能使用了很多缓存键。
0赞
Rajan
4/14/2017
没错@Boney,但这是他可以获得会话超时的唯一事件。如果他想使用缓存,他还需要存储所有缓存密钥。否则会话是最好的方法。
0赞
Pranav Kumar
4/14/2017
但@Rajan,建议 Session 保持非常小,并再次坚持使用主要数据类型,如整数和字符串。如果此陈述错误,请澄清。由于我需要在服务器端存储“数据表(用户特定数据)”以避免重复的数据库调用,因此对于我的用例来说,“会话”是比“缓存”更好的方法吗?
0赞
Rajan
4/14/2017
取决于您的要求。当我们需要时,我们也在其中抚摸大物体。您也可以使用状态服务器。- @PranavKumar
1赞
Rajan
4/20/2017
另一种方法是对缓存和会话执行相同的超时。它也可以解决您的问题。请评价我的答案。这样我就可以获得声誉...... :) @PranavKumar
评论