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

  • 相关阅读:
    hello , world Tkinter代码描述
    Tkinter 类
    什么是Tkinter?
    99_恢复二叉搜索树
    总结eclipse中常用好用的快捷键或者自定义一下快捷键:
    封装与职责分离的开发思维
    正在学习的路上
    串比较
    坚持的力量 第二十篇
    串连接
  • 原文地址:https://www.cnblogs.com/fxck/p/13076928.html
Copyright © 2011-2022 走看看