在我的AppStart.cshtml中,我从数据库中获取一些数据,进行计算,序列化/反序列化json字符串等等,并通过执行以下操作将结果存储在几个AppState变量中:(C#)
AppState["myVar1"]="aString";
AppState["myVar2"]=anArray;
这些变量经常被访问并且定义有点沉重,因此我认为这样的事情是有意义的,而不是每次需要时从头开始创建数据。即使不需要优化,它仍然对我有意义,因为它还通过在需要该数据的一堆地方没有相同的代码来提高可读性和绝对可维护性。
同样,我通过在用户登录时将数据放入Session中来对每个用户进行类似的操作,例如
Session["userVar1"]="myString";
Session["userVar2"]=myAray;
但是,我刚刚读到,当我们想要读取它们时,我们永远不应该依赖存储在这些数据中的数据,因为它们存储在可能已被清除的服务器内存中。 这是真的? 因此,当我们想要访问其中一个时,我们应该首先检查它是否为空?如果我们很幸运,它不是空的,我们可以立即使用它,否则我们再次设置它。 这是应该如何使用存储在AppState和Session中的数据?如果是这样的话,如果它们是空的,那么重新设置它们的好方法是什么?我想做一些事情,比如创建一个函数,如果它们为空则设置它们?
答案 0 :(得分:1)
在你的情况下,如果服务器偶尔清除数据(例如,从IIS重新启动应用程序进程),听起来很好,因为你所描述的只是一个缓存场景。缓存数据本质上是瞬态的。如果它在那里,使用它。如果不存在,请重新获取它(并再次使用结果填充缓存)。
我建议从缓存本身的结构中抽象出缓存机制(应用状态和会话状态)。在此结构中,您可以检查数据是否已缓存,如果没有,则重新缓存它。考虑这样一个对象:
public class CacheManager
{
public static string MyString
{
get
{
if (string.IsNullOrWhiteSpace(AppState["myVar1"]))
{
// Fetch the value to be cached and set it in AppState["myVar1"]
}
return AppState["myVar1"];
}
}
}
现在您的应用程序中的任何位置都可以通过调用来获取值:
CacheManager.MyString
应用程序的其余部分不知道或不关心它是来自应用程序状态,会话状态,数据库,文件,还是缓存数据的任何其他临时位置。这完全由缓存管理器对象处理。因此,如果您想要更改某些值所在的位置,请在该位置更改它们。或者,如果出于测试目的,您希望完全删除缓存并始终实时获取数据,那么您只需将缓存管理器实现替换为始终返回重新获取的数据的实现。应用程序的其余部分幸福地没有意识到实现。