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

  • 相关阅读:
    zmap zgrab 环境搭建
    RF是如何工作的?
    RF的优缺点
    国内NLP的那些人那些会
    B-、B+、B*树
    关于LDA的gibbs采样,为什么可以获得正确的样本?
    LDA算法里面Dirichlet分布的两个参数alpha和beta怎样确定?
    如何确定LDA的主题个数
    SMO算法精解
    奇异值与主成分分析(PCA)
  • 原文地址:https://www.cnblogs.com/fxck/p/13076928.html
Copyright © 2011-2022 走看看