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