配置ASP.NET MVC项目与EntityFramework,改用Redis作为缓存提供程序
在ASP.NET Core MVC中配置EF二级缓存并切换为Redis提供程序
我来帮你一步步实现这个需求,以下是完整的配置步骤和代码示例:
首先,你需要安装必要的NuGet包,可以通过NuGet包管理器控制台或者Visual Studio的NuGet界面安装:
Microsoft.EntityFrameworkCoreCacheManager.CoreCacheManager.RedisCacheManager.Serialization.JsonMicrosoft.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
相关产品推荐
相关产品推荐

