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

配置ASP.NET MVC项目与EntityFramework,改用Redis作为缓存提供程序

在ASP.NET Core MVC中配置EF二级缓存并切换为Redis提供程序

我来帮你一步步实现这个需求,以下是完整的配置步骤和代码示例:

首先,你需要安装必要的NuGet包,可以通过NuGet包管理器控制台或者Visual Studio的NuGet界面安装:

  • Microsoft.EntityFrameworkCore
  • CacheManager.Core
  • CacheManager.Redis
  • CacheManager.Serialization.Json
  • Microsoft.EntityFrameworkCore.Cacheable(用于EF查询缓存的扩展)

接下来,在你的Program.cs(.NET 6+顶级语句模式)或者Startup.cs的ConfigureServices方法中配置Redis缓存服务:

using CacheManager.Core;
using CacheManager.Redis;
using CacheManager.Serialization.Json;
using Newtonsoft.Json;

// 配置Json序列化规则,避免空值和循环引用问题
var jss = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
};

const string redisConfigurationKey = "redis";

// 注册CacheManager的核心配置,指定Redis作为缓存后端
services.AddSingleton<ICacheManagerConfiguration>(new CacheManagerConfiguration
{
    BackplaneName = redisConfigurationKey,
    BackplaneType = typeof(RedisCacheBackplane),
    SerializerType = typeof(JsonCacheSerializer),
    Settings = new List<CacheConfigurationSetting>
    {
        // 替换成你的实际Redis连接字符串,带密码的格式为 "redis://password@localhost:6379"
        new CacheConfigurationSetting(redisConfigurationKey, "localhost:6379")
    }
});

// 将CacheManager服务注入DI容器
services.AddCacheManager();

然后,在你的DbContext中启用EF二级缓存,并注入刚才配置好的CacheManager:

using CacheManager.Core;
using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    private readonly ICacheManager<object> _cacheManager;

    // 通过构造函数注入CacheManager实例
    public AppDbContext(DbContextOptions<AppDbContext> options, ICacheManager<object> cacheManager)
        : base(options)
    {
        _cacheManager = cacheManager;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 启用EF查询缓存,绑定Redis作为缓存提供程序
        optionsBuilder.UseQueryCache(_cacheManager);
    }

    // 定义你的业务实体DbSet
    public DbSet<Product> Products { get; set; }
}

现在你就可以在查询中使用二级缓存了,比如在Controller里:

public class ProductController : Controller
{
    private readonly AppDbContext _dbContext;

    public ProductController(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IActionResult Index()
    {
        // 缓存查询结果10分钟,使用绝对过期策略
        var cachedProducts = _dbContext.Products
            .Where(p => p.IsInStock)
            .Cacheable(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(10))
            .ToList();

        return View(cachedProducts);
    }
}

关键注意事项:

  • 确保你的Redis服务已经启动,连接字符串配置与实际环境匹配(比如集群、密码认证等)
  • 实体类需要支持序列化,避免包含无法序列化的属性(我们已经在Json配置中处理了循环引用问题)
  • 当执行数据更新/删除操作时,记得手动清理对应缓存,避免数据不一致。比如可以通过_cacheManager.Remove("缓存键")或者使用缓存标签批量清理
  • 若需要更精细的缓存控制,可以自定义缓存键或者划分缓存区域

内容的提问来源于stack exchange,提问作者Ramin Bateni Parvar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:49:13