首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Asp.net MVC项目和EntityFramework配置为使用Redis作为缓存提供程序

将Asp.net MVC项目和EntityFramework配置为使用Redis作为缓存提供程序
EN

Stack Overflow用户
提问于 2018-05-03 14:18:15
回答 1查看 1.6K关注 0票数 0

我希望使用EF二级缓存,并将EF的默认缓存提供程序更改为在ASP.NET MVC项目中使用Redis而不是InMemory缓存提供程序。

我有以下MVC Core的示例代码:

代码语言:javascript
运行
复制
// Add Redis cache service provider
var jss = new JsonSerializerSettings
{
    NullValueHandling = NullValueHandling.Ignore,
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};

const string redisConfigurationKey = "redis";
services.AddSingleton(typeof(ICacheManagerConfiguration),
    new CacheManager.Core.ConfigurationBuilder()
        .WithJsonSerializer(serializationSettings: jss, deserializationSettings: jss)
        .WithUpdateMode(CacheUpdateMode.Up)
        .WithRedisConfiguration(redisConfigurationKey, config =>
        {
            config.WithAllowAdmin()
                .WithDatabase(0)
                .WithEndpoint("localhost", 6379);
        })
        .WithMaxRetries(100)
        .WithRetryTimeout(50)
        .WithRedisCacheHandle(redisConfigurationKey)
        .WithExpiration(ExpirationMode.Absolute, TimeSpan.FromMinutes(10))
        .Build());
services.AddSingleton(typeof(ICacheManager<>), typeof(BaseCacheManager<>));

我的项目是而不是 MVC Core,它是MVC。此外,我使用StructureMaps作为IOC。

现在我有两个问题:

  1. 如何将项目中的EF配置为使用Redis作为其二级缓存提供程序(我正在使用包)?
  2. 我能否以这种方式在我的计算机上的一个单独项目中使用缓存中保存的数据(在多个应用程序之间共享MVC应用程序的缓存)?
EN

Stack Overflow用户

发布于 2018-05-03 15:03:12

StructureMap中的Redis

在StructureMap中有相当数量的代码来注册该服务。在这个系统中,单例有点不同,您最好使用“工厂”模式来创建和管理您的redis缓存。SM有一个汽车厂来完成这个任务。

如果你愿意的话,我可以在这里张贴一些基本代码。但是-您需要在您的环境中进行测试才能让它正常工作(我不喜欢在堆栈上发布理论代码)。

如果您以前没有使用过redis,我会创建一个控制台应用程序,并确保您可以在将IOC和.Net MVC应用插入图片之前对其进行配置和运行(您是一个强大的编码器,所以我不会告诉您您还不知道的事情)。

其他应用程序可以使用Redis缓存吗?

是。只要他们能够访问您创建的端点(在上面的代码中,它正在监听localhost:6379)。

您可以使用与在MVC应用程序中使用的相同的“配置”设置。当您这样做时,两个应用程序都会访问相同的redis "server“,并共享相同的缓存对象。

对redis的看法与您对数据库的看法相同:只要两个系统使用相同的"config“(例如- connect字符串),那么它们就可以访问相同的数据。

红色超快而且很酷。你会喜欢的!

完全未经测试的样本代码

下面是一个简单的概述,这样我对代码结构的评论就更有意义了。如果其他人对调整有建议,可以随意添加评论,我会更新的。

代码语言:javascript
运行
复制
public interface ICacheManagerConfigFactory {
    ICacheManagerConfiguration CreateCacheManager();
}

public CacheManagerFactory:ICacheManagerConfigFactory {

    private static ICacheManagerConfiguration _cache;
    private static object syncRoot = new Object();
    
    public ICacheManagerConfiguration CreateCacheManager() {

        if(_cache!=null) { return _cache; } 
        //locking to make sure that we only create 1 _cache object (thread-safe)
        lock(syncRoot) {
            //idiot-proofing our thread-safe code
            if(_cache!=null) { return _cache; } 
            //create _cache if it doesn't already exist
            var jss = new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore,
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            };  
            _cache= new CacheManager.Core.ConfigurationBuilder()
               .WithJsonSerializer(serializationSettings: jss, deserializationSettings: jss)
               ... etc ...
               .Build();
        }
        return _cache;
    }
}

而且,这只是一个快速的测试方法,证明了我们可以从内存中提取静态配置。它也是从SM的汽车厂文档中提取的。

代码语言:javascript
运行
复制
public void Simple_factory_creation() {
    var container = new Container(cfg => {
        cfg.For<ICacheManagerConfiguration>().Use<CacheManagerFactory>();
        cfg.For<ICacheManagerConfigFactory>().CreateFactory();
    });

    var cache = container.GetInstance<ICacheManagerConfiguration>();

}   
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50157304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档