我在IIS6上运行C#(FrameWork 4.0)中的应用程序。
我想永久缓存数据数据(徒步) 但是事件或类似事件会删除此缓存数据, 在短时间内(15-25分钟)。
我只使用此选项配置IIS:回收工作进程(以分钟为单位)1740。
保留缓存数据的任何想法? 静态变量的文件时间是否与应用程序生存期相同?
public class CacheUsers
{
static object objlock;
private static List<Users> usersList { get; set; }
private static DateTime lastUpdate;
public CacheUsers()
{
if (objlock == null)
{
objlock = new object();
}
lock (objlock)
{
if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24)))
{
UpdateUserList();
}
}
}
public static List<Users> ListaCacheada
{
get
{
if (usersList == null || usersList.Count.Equals(0) || (lastUpdate < DateTime.Now.AddHours(-24)))
{
UpdateUserList();
}
return usersList;
}
}
/// <summary>
/// Refresh the user list
/// </summary>
private static void UpdateUserList()
{
usersList = GetUsers();
lastUpdate = DateTime.Now;
}
}
答案 0 :(得分:1)
编辑:对象可以存活多久 -
技术上 AppDomain中的CLR对象无法在重新启动该AppDomain后继续存在(即在ASP.Net中它可能由web.config中的更改引起),因此无法幸存AppPool循环(进程关闭)。本地对象也无法在AppPool回收中存活。
不再需要回收AppPool会再次创建进程(实际上不会),只有首次请求此AppPool所服务的站点才会启动进程。
因此,如果你的目标是严格的“我的CLR对象必须在AppPool循环后立即在某种缓存中”,那么最接近的是重新缓存Application_Start中的对象(或模块中的等效方法)。请注意,不保证在程序集加载时创建静态对象,因此如果要使用静态对象进行缓存,仍需要触发创建,即在Application_Start中访问它们。
如果您需要超出AppPool生命周期的对象 - 您需要一个单独的服务。此类系统必须将对象保留在进程外(有时是机器),因此您需要支付远程访问此类对象的成本。
您可能对分布式缓存(例如memcachd)感兴趣,看它是否符合您的需求。
正常的“缓存”用法是缓存创建成本高昂的对象,目前还不清楚想要实现“缓存”定义。
通常通过在提供对象的方法中隐藏缓存逻辑来完成:
MyObject GetMyObject()
{
MyObject result= cacheProvider.Get("cacheId_MyObject");
if (result = null)
{
result = VerySlowMethodToCreateMyObject();
cacheProvider.Cache("cacheId_MyObject", result);
}
return result;
}
考虑简单地使用System.Web.Caching.Cache。它的Insert方法提供了很多选项。如果您提供onRemoveCallback,您甚至可以实现“永久缓存”项目。
答案 1 :(得分:0)
我已经查了代码,我使用了HttpRuntime.Cache,没有任何反应。 : - (
问题是App Pool每天只能运行一次,因为:
似乎有些事情正在推出这个过程很多次(aprox,每15分钟一次)。我只使用此选项配置IIS:回收工作进程(以分钟为单位)1740
我只是想停止App Pool回收站。我可以做什么?
public class CacheUsers
{
static object objlock;
private static List<Users> usersList { get; set; }
public CacheUsers()
{
if (objlock == null)
{
objlock = new object();
}
lock (objlock)
{
if (usersList == null || usersList.Count.Equals(0))
{
UpdateUserList();
}
}
}
private static void UpdateUserList()
{
usersList = GetList();
HttpRuntime.Cache.Insert("Key", usersList , null,
Cache.NoAbsoluteExpiration,
Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.NotRemovable,
ReportRemovedCallback
);
}
}
ReportRemovedCallback指示原因:已删除。但是,谁做到了?