C#自己造輪子寫一個簡單的緩存類

該類需要包含的功能:添加緩存、獲取緩存、刪除緩存、定時清理過期緩存。代碼如下:

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 "更新方法返回的結果";
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章