【问题标题】:Caching is working for one hour while it should be for days缓存工作一小时,而它应该工作几天
【发布时间】:2019-12-30 09:15:44
【问题描述】:

我使用 .NETCore 2.0 创建了一个 API;该 API 连接到 oracle 数据库以检索所需数据;其中一个功能需要太多时间,所以我决定使用缓存来更快地检索数据;

功能说明:获取排名

缓存周期:数据应在每周一更新缓存内存

我正在使用IMemoryCache,但问题是数据没有被缓存多天;在从数据库中检索数据并且花费太多时间(10 秒)之后,它只持续一小时;以下是我的代码:

var dateNow = DateTime.Now;

int diff = 7; // if today is Monday then should add 7 days to get next Monday date

if (dateNow.DayOfWeek != DayOfWeek.Monday) {
    var daysToStartWeek = dateNow.DayOfWeek - DayOfWeek.Monday;
    diff = (7 - (daysToStartWeek)) % 7;
}

var nextMonday = dateNow.AddDays(diff).Date;
var totalDays = (nextMonday - dateNow).TotalDays;

if (_cache.TryGetValue("GetRanking", out IEnumerable<GetRankingStruct> objRanking))                   
    {
         return Ok(objRanking);
    }

var dp = new DataProvider(Configuration);
var response = dp.GetRanking(userName, asAtDate);

_cache.Set("GetRanking", response, TimeSpan.FromDays(diff));

return Ok(response);

可能与令牌生命时间有关,因为它只有 1 小时?

【问题讨论】:

    标签: caching .net-core memorycache


    【解决方案1】:

    首先 - 您是否尝试过检查您的工作进程是否正在重新启动?您没有指定托管应用程序的方式,但显然,如果重新启动应用程序(工作进程),您的内存缓存将为空。 如果您的工作进程/进程正在重新启动,那么您可以在启动时加载缓存。

    其次-我相信由于不活动或内存限制,实现可能会选择清空缓存。您可以将优先级设置为永不删除 - https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.memory.cacheitempriority?view=dotnet-plat-ext-3.1 我相信您可以通过将 MemoryCacheOptions 对象传递给内存缓存https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.caching.memory.memorycache.-ctor?view=dotnet-plat-ext-3.1#Microsoft_Extensions_Caching_Memory_MemoryCache__ctor_Microsoft_Extensions_Options_IOptions_Microsoft_Extensions_Caching_Memory_MemoryCacheOptions__ 的构造函数来进行设置。

    最后 - 我假设您已将 _cache 对象设为静态,以便您的类的所有实例共享它。 (或者把控制器做成一个单例)。

    这些是我的建议。 祝你好运。

    【讨论】:

    • 感谢您的回复;实际上我正在网络服务器上发布 - windows server 2016;应用程序从未在 IIS 上重新启动;
    • 缓存在控制器的构造函数中定义为public UserController(IConfiguration configuration, IMemoryCache cache) { Configuration = configuration; _cache = cache; }
    • 我已将我的代码更新为MemoryCacheEntryOptions options = new MemoryCacheEntryOptions(); options.Priority = CacheItemPriority.NeverRemove; options.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(120); _cache.Set("GetRanking", response, options);,但没有运气;第一次调用后 60 分钟后,从数据库返回数据;
    • "windows server 2016;该应用程序从未在 IIS 上重新启动" - IIS 将自动重新启动 - docs.microsoft.com/en-us/iis/configuration/… 通常是 29 小时 - 但可能值得在您的服务器上检查。
    • “ache 是在控制器的构造函数中定义的”——它似乎是传入的——所以你需要检查是否只有一个构造函数。即调用 new 的类是单例/静态或对象是单例/静态,即某些时候保证只创建一个缓存实例。话虽如此,60 分钟(对我而言)更多地指向 IIS 设置。
    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多