该类需要包含的功能:添加缓存、获取缓存、删除缓存、定时清理过期缓存。代码如下:
public class CacheManage
{
/// <summary>
/// 定时清理过期缓存,10分钟清理一次
/// </summary>
static CacheManage()
{
Task.Run(() =>
{
while (true)
{
List<string> keyList = new List<string>();
foreach (var key in _cache.Keys)
{
var valueTime = _cache[key].Value;
if (DateTime.Now > valueTime)
{
_cache.Remove(key);
}
}
Thread.Sleep(1000 * 60 * 10);
}
});
}
private static Dictionary<string, KeyValuePair<object, DateTime>> _cache = new Dictionary<string, KeyValuePair<object, DateTime>>();
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">缓存key,唯一</param>
/// <param name="value">缓存value</param>
/// <param name="timoutSecond">过期时间</param>
public static void Add(string key, object value, int timoutSecond = 1800)
{
_cache.Add(key, new KeyValuePair<object, DateTime>(value, DateTime.Now.AddSeconds(timoutSecond)));
}
/// <summary>
/// 移除所有缓存
/// </summary>
public static void RemoveAll()
{
_cache.Clear();
}
/// <summary>
/// 移除指定key 的缓存
/// </summary>
/// <param name="func"></param>
public static void RemoveCondition(Func<string, bool> func)
{
List<string> keyList = new List<string>();
foreach (var key in _cache.Keys)
{
if (func.Invoke(key))
{
keyList.Add(key);
}
}
keyList.ForEach(k => _cache.Remove(k));
}
/// <summary>
/// 是否包含指定key
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool Exist(string key)
{
if (_cache.ContainsKey(key))
{
var valueTime = _cache[key].Value;
if (DateTime.Now > valueTime)
{
_cache.Remove(key);
return false;
}
else
{
return true;
}
}
else
{
return false;
}
}
public static T Get<T>(string key)
{
return (T)_cache[key].Key;
}
/// <summary>
/// 获取或添加缓存,如果key不存在则添加到缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="func"></param>
/// <returns></returns>
public static T GetOrAdd<T>(string key, Func<T> func)
{
T tResult = default(T);
if (!Exist(key))
{
tResult = func.Invoke();
Add(key, tResult);
}
else
{
tResult = Get<T>(key);
}
return tResult;
}
}
调用:
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
var key = "update";
var result = string.Empty;
Console.WriteLine($"更新开始执行... 当前时间为:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
#region 缓存读写方式
// 方法一
if (CacheManage.Exist(key))
{
result = CacheManage.Get<string>(key);
}
else
{
result = Update();
CacheManage.Add(key, result);
}
// 方法一 的简写
result = CacheManage.GetOrAdd("update", () =>
{
return Update();
});
#endregion
#region 移除指定key的缓存
CacheManage.RemoveCondition((string v) =>
{
return v.Contains(key);
});
Console.WriteLine(CacheManage.Exist(key));
#endregion
Console.WriteLine(result);
Console.WriteLine($"更新执行完成... 当前时间为:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff")}");
Console.WriteLine();
}
}
public static string Update()
{
var sun = 0;
for (int i = 0; i < 100000000; i++)
{
sun += i;
}
Thread.Sleep(2000);
return "更新方法返回的结果";
}