zoukankan      html  css  js  c++  java
  • 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 自动判断是否过期,如果过期就执行查询逻辑,没过期就返回静态变量。

  • 相关阅读:
    后缀数组模板
    UVALive
    蓝桥杯 拿糖果
    蓝桥杯 矩阵乘法(区间DP)
    51nod 矩阵乘法
    13.boost有向无向图邻接表表示
    12.boost有向图无向图(矩阵法)
    11.使用boostregex遭遇无法打开libboost_regex-vc120-mt-sgd-1_62.lib的问题
    10.ref regex unordered_set smartpoint
    9.variant move function change_cast
  • 原文地址:https://www.cnblogs.com/fxck/p/13076928.html
Copyright © 2011-2022 走看看