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

猜你喜欢

转载自blog.csdn.net/qq_32109957/article/details/102796424