在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
相关产品推荐
相关产品推荐

