static 缓存通过 DateTime 实现定时过期

在使用 static 缓存一些数据的时候可能会遇到需要更新的场景。

 

有没有方法实现 static 一段时间后自动过期呢?真对这样的场景我使用下面的方式来实现:

    public class TimerCache<T>
    {
        public DateTime GetTime = DateTime.UtcNow;
        public T Data;
        public T Get(float seconds, Func<T> func)
        {
            if (DateTime.UtcNow.Subtract(GetTime).TotalMilliseconds >= seconds * 1000 || Data == null)
            {
                Data = func();
                GetTime = DateTime.UtcNow;
            }
            return Data;
        }
        public async Task<T> GetAsync(float seconds, Func<Task<T>> func)
        {
            if (DateTime.UtcNow.Subtract(GetTime).TotalMilliseconds >= seconds * 1000 || Data == null)
            {
                Data = await func();
                GetTime = DateTime.UtcNow;
            }
            return Data;
        }
    }

通过这样的方式就实现来定时缓存的功能,过期后再被访问重新加载又被缓存下来了。

---- 调用方式 ----

static TimerCache<List<SystemParameter>> sysCache = new TimerCache<List<SystemParameter>>();
return sysCache.GetAsync(3600, () =>
{
    const string sql = "SELECT * FROM coin_systemparameter";
    using (var conn = PSQLDbBase.GetConnection())
    {
       var result = conn.Base.QueryAsync<SystemParameter>(sql);
       return Task.FromResult(result.Result.ToList());
    }
});

首先通过声明 TimerCache 类型的静态变量,在是使用这个静态变量时,就会通过 Subtract 自动判断是否过期,如果过期就执行查询逻辑,没过期就返回静态变量。

posted @ 2018-12-29 19:30  Jöhan  阅读(167)  评论(0编辑  收藏  举报