You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何为IMemoryCache设置多时间点的绝对过期时间?

实现多每日时间点的缓存绝对过期逻辑

我之前也碰到过类似的需求,刚好可以给你分享一套实用的实现方案!核心就是先写个方法找到当前时间之后的下一个预定义时间点,再把它作为缓存的绝对过期时间。

第一步:编写获取下一个时间点的核心方法

这个方法接收预定义的每日时间点(比如09:00、18:00),返回当前时间之后的第一个匹配时间:

public static DateTime GetNextScheduledTime(List<TimeSpan> dailyTimes)
{
    var now = DateTime.Now;
    var today = now.Date;

    // 把所有预定义的时间点转换成今天的具体DateTime
    var todayTimePoints = dailyTimes.Select(ts => today.Add(ts)).ToList();
    // 额外添加次日最早的时间点,防止当前时间晚于今天所有时间点
    var tomorrowFirstPoint = today.AddDays(1).Add(dailyTimes.Min());
    todayTimePoints.Add(tomorrowFirstPoint);

    // 筛选出晚于当前时间的所有时间点,取最小的那个就是目标过期时间
    return todayTimePoints.Where(t => t > now).Min();
}

逻辑细节说明:

  • 用TimeSpan定义时间点更灵活,方便后续从配置文件读取或调整
  • 添加次日最早时间点是为了处理「当前时间已过今日所有时间点」的场景(比如21:00时自动取次日09:00)
  • 如果你希望当前时间恰好等于某个时间点时,就用该时间点作为过期时间,把判断条件t > now改成t >= now即可

第二步:在IMemoryCache中落地使用

有了核心方法,直接结合缓存配置就能实现需求:

// 预定义每日的过期时间点:09:00、18:00
var dailyExpirationPoints = new List<TimeSpan>
{
    new TimeSpan(9, 0, 0),
    new TimeSpan(18, 0, 0)
};

// 获取下一个缓存过期时间
var nextExpTime = GetNextScheduledTime(dailyExpirationPoints);

// 设置缓存,应用绝对过期规则
_memoryCache.Set("YourCacheKey", yourCacheValue, new MemoryCacheEntryOptions
{
    AbsoluteExpiration = nextExpTime
});

额外优化建议

  • 可以把GetNextScheduledTime封装成静态工具类方法或扩展方法,方便全项目复用
  • 如果时间点是从配置读取的,记得做合法性校验(比如确保时间范围在00:00-23:59之间)
  • 对跨时区的服务,建议用DateTime.UtcNow替代DateTime.Now,同时把预定义时间点也转换成UTC格式,避免夏令时或时区切换的影响

内容的提问来源于stack exchange,提问作者XRaycat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:57:55