一旦会话(在进程中)在 ASP.Net 中超时,如何删除“用户特定的数据缓存”?

How to remove the "user specific data-cache" once the session(In Proc) gets timeout in ASP.Net?

提问人:Pranav Kumar 提问时间:4/14/2017 更新时间:4/16/2017 访问量:727

问:

我们将会话超时设置为 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);

但是一旦会话超时,我需要删除用户特定的数据缓存

请帮帮我。

asp.net 会话 缓存 服务器端 SQLCachachDependency

评论


答:

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