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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:45:04