我有一个 C# WebAPI,它有一个整理大量数据的查询。随后,我使用 HttpRuntime 缓存将结果对象缓存 10 分钟。问题是,当缓存过期时,那个人会得到 12 秒的负载。此应用程序使用 3 个交付服务器,我们没有分布式缓存的选项。
使用 .NET,我们可以使用缓存过期事件,但是如何在不影响调用请求的情况下最好地使用它呢?
一个想法是拥有一个永不过期的缓存,这样如果主缓存过期,则回退到那个,然后有一个 Windows 服务或类似的服务,每 5 分钟轮询一次以刷新两个缓存。
想法?
我有一个 C# WebAPI,它有一个整理大量数据的查询。随后,我使用 HttpRuntime 缓存将结果对象缓存 10 分钟。问题是,当缓存过期时,那个人会得到 12 秒的负载。此应用程序使用 3 个交付服务器,我们没有分布式缓存的选项。
使用 .NET,我们可以使用缓存过期事件,但是如何在不影响调用请求的情况下最好地使用它呢?
一个想法是拥有一个永不过期的缓存,这样如果主缓存过期,则回退到那个,然后有一个 Windows 服务或类似的服务,每 5 分钟轮询一次以刷新两个缓存。
想法?
也许将结果单独缓存到页面缓存会有所帮助。基于http://johnnycoder.com/blog/2008/12/10/c-cache-helper-class/
由于它是静态的,因此您可以使用 WCF 以您自己的节奏进行刷新。
我修改为静态而不是http
public static class CacheHelper
{
public static void WriteOutCacheHelper()
{
foreach (KeyValuePair<string, object> cache in Cache)
{
Console.WriteLine(cache.Key);
}
}
public static void WriteOutCacheHelper(string key)
{
Console.WriteLine(Get<object>(key).ToString());
}
public static bool Enabled { get; set; }
private static Dictionary<string, object> _cache;
public static Dictionary<string, object> Cache
{
get
{
if (_cache == null) _cache = new Dictionary<string, object>();
return _cache;
}
}
public static object lockObject = new object();
public static void Add<T>(T o, string key)
{
if (!Enabled) return;
lock (lockObject)
{
if (Exists(key))
Cache[key] = o;
else
Cache.Add(key, o);
}
}
public static void Clear(string key)
{
if (!Enabled) return;
Cache.Remove(key);
}
public static bool Exists(string key)
{
if (!Enabled) return false;
return Cache.ContainsKey(key);
}
public static T Get<T>(string key)
{
if (!Enabled) return default(T);
T value;
try
{
value = (!Exists(key) ? default(T) : (T) Cache[key]);
}
catch
{
value = default(T);
}
return value;
}
public static void ClearAll(bool force = false)
{
if (!force && !Enabled) return;
Cache.Clear();
}
public static List<T> GetStartingWith<T>(string cacheKey) where T : class
{
if (!Enabled) new List<T>();
return Cache.ToList().FindAll(f => f.Key.StartsWith(cacheKey, StringComparison.CurrentCultureIgnoreCase))
.Select(s => s.Value as T).ToList();
}
}