我希望使用EF二级缓存,并将EF的默认缓存提供程序更改为在ASP.NET MVC项目中使用Redis而不是InMemory缓存提供程序。
我有以下MVC Core的示例代码:
// 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。
现在我有两个问题:
EF配置为使用Redis作为其二级缓存提供程序(我正在使用这包)?发布于 2018-05-03 15:03:12
StructureMap中的Redis
在StructureMap中有相当数量的代码来注册该服务。在这个系统中,单例有点不同,您最好使用“工厂”模式来创建和管理您的redis缓存。SM有一个汽车厂来完成这个任务。
如果你愿意的话,我可以在这里张贴一些基本代码。但是-您需要在您的环境中进行测试才能让它正常工作(我不喜欢在堆栈上发布理论代码)。
如果您以前没有使用过redis,我会创建一个控制台应用程序,并确保您可以在将IOC和.Net MVC应用插入图片之前对其进行配置和运行(您是一个强大的编码器,所以我不会告诉您您还不知道的事情)。
其他应用程序可以使用Redis缓存吗?
是。只要他们能够访问您创建的端点(在上面的代码中,它正在监听localhost:6379)。
您可以使用与在MVC应用程序中使用的相同的“配置”设置。当您这样做时,两个应用程序都会访问相同的redis "server“,并共享相同的缓存对象。
对redis的看法与您对数据库的看法相同:只要两个系统使用相同的"config“(例如- connect字符串),那么它们就可以访问相同的数据。
红色超快而且很酷。你会喜欢的!
完全未经测试的样本代码
下面是一个简单的概述,这样我对代码结构的评论就更有意义了。如果其他人对调整有建议,可以随意添加评论,我会更新的。
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的汽车厂文档中提取的。
public void Simple_factory_creation() {
    var container = new Container(cfg => {
        cfg.For<ICacheManagerConfiguration>().Use<CacheManagerFactory>();
        cfg.For<ICacheManagerConfigFactory>().CreateFactory();
    });
    var cache = container.GetInstance<ICacheManagerConfiguration>();
}   https://stackoverflow.com/questions/50157304
复制相似问题