.NET Core EF项目如何将两个无关联查询结果存入同一内存缓存
方案可行性说明
你提到的将两个查询结果合并存入同一个缓存项的思路完全可行,无需手动序列化为JSON:.NET Core 自带的 IMemoryCache 原生支持存储任意强类型对象,相比JSON序列化/反序列化的方案,性能开销更低,也不需要处理序列化兼容性问题。
推荐实现方案
1. 定义强类型缓存模型
首先创建专用的缓存存储类,统一封装两个查询结果:
public class DailyBusinessConfigCache { // 存储周几对应的启停时间配置 public WeekdayScheduleSettings WeekdaySettings { get; set; } // 存储当日是否为假期的判断结果 public bool IsCurrentDayHoliday { get; set; } }
2. 实现合并缓存逻辑
建议用 GetOrCreateAsync 方法实现原子化读写,避免缓存击穿,同时可并行执行两个无关联EF查询降低耗时:
// 缓存键按日期维度定义,符合两个数据的业务属性,每天自动失效 const string CacheKeyPrefix = "DailyBusinessConfig_"; var todayCacheKey = $"{CacheKeyPrefix}{DateTime.Today:yyyyMMdd}"; var cacheResult = await _memoryCache.GetOrCreateAsync(todayCacheKey, async cacheEntry => { // 配置缓存过期规则,可根据业务需求调整为滑动过期或更短的绝对过期时间 cacheEntry.AbsoluteExpiration = DateTime.Today.AddDays(1); // 并行执行两个无关联查询,比顺序执行减少近一半的查询耗时 var settingsQueryTask = _dbContext.Settings .FirstOrDefaultAsync(s => s.WeekDay == (int)DateTime.Now.DayOfWeek); var holidayQueryTask = _dbContext.HolidayWeeks .AnyAsync(h => h.HolidayDate == DateTime.Today); await Task.WhenAll(settingsQueryTask, holidayQueryTask); return new DailyBusinessConfigCache { WeekdaySettings = settingsQueryTask.Result, IsCurrentDayHoliday = holidayQueryTask.Result }; });
可选场景说明
如果两个查询结果的失效规则差异很大(比如启停时间配置半小时更新一次,假期配置每天更新一次),也可以分开存储为两个独立缓存项,内存缓存的单键开销极低,不需要为了合并而强行统一失效规则。
内容的提问来源于stack exchange,提问作者user4912134
相关产品推荐
相关产品推荐

