該類需要包含的功能:添加緩存、獲取緩存、刪除緩存、定時清理過期緩存。代碼如下:
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 "更新方法返回的結果";
}