Asp.net core 如何在ASP.NET Core中使用EFCore进行缓存

Asp.net core 如何在ASP.NET Core中使用EFCore进行缓存,asp.net-core,entity-framework-core,Asp.net Core,Entity Framework Core,我在一个表上有一个select查询,它给出了网站上最后的搜索结果 这是为了灵感,不需要为每个页面调用更新,因此我希望在搜索开始显示一些性能影响时缓存这些搜索 我的网站使用ASP.NET核心和EFCore 我相信在一条线上没有内置的方法可以做到这一点。 最好的方法是什么? 我正在考虑每10分钟更新内存中最后300次搜索,并随机选择其中的几个 到目前为止,我已经找到了这两个我可以使用的选项: ASP.Net核心的原始缓存方法 EFCore开源扩展,它不仅仅包括缓存 我使用的解决方案是: in

我在一个表上有一个select查询,它给出了网站上最后的搜索结果

这是为了灵感,不需要为每个页面调用更新,因此我希望在搜索开始显示一些性能影响时缓存这些搜索

我的网站使用ASP.NET核心和EFCore

我相信在一条线上没有内置的方法可以做到这一点。 最好的方法是什么?

我正在考虑每10分钟更新内存中最后300次搜索,并随机选择其中的几个

到目前为止,我已经找到了这两个我可以使用的选项:

  • ASP.Net核心的原始缓存方法

  • EFCore开源扩展,它不仅仅包括缓存


  • 我使用的解决方案是:

    in startup.cs:
    services.AddMemoryCache();
    
    
    in view/controller:
    var LAST_SEARCHS_COUNT = 5;
    var lastSearchs = await Cache.GetOrCreateAsync<List<Search>>("LAST_SEARCHS"
        ,(k)=> {
            k.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
            return (from s in DbContext.Searchs
                    orderby s.CreationTime descending
                    select s).Take(LAST_SEARCHS_COUNT * 40).ToListAsync();
        });
    
    startup.cs中的
    :
    services.AddMemoryCache();
    在视图/控制器中:
    var LAST_SEARCHS_COUNT=5;
    var lastSearchs=await Cache.GetOrCreateAsync(“LAST\u SEARCHS”
    ,(k)=>{
    k、 AbsoluteExpirationRelativeToNow=从分钟开始的时间跨度(10);
    返回(来自DbContext.Searchs中的
    orderby s.CreationTime降序
    选择s).Take(上次搜索s\u COUNT*40).toListSync();
    });
    
    影响相当大,通话次数除以100以上:

    您可以使用


    您还可以保留DataContext的静态实例,并确保启用了更改跟踪。这将使其保留在内存中以跟踪更改。不过它可能会变慢。

    谢谢链接,它扩展了我的解决方案编号1。这不适合我的情况,因为我更喜欢对同一用户的每个请求都有不同的随机结果,而且我只需要部分查看就可以了(不过这看起来是一个不错的解决方案,我可能会用于其他具有更多“静态”内容的情况),无论如何,谢谢<代码>包含已验证客户端内容的响应必须标记为不可缓存,以防止中间件存储和服务这些响应。Oops…:)
    [ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
    public IActionResult About2()
    {