Настройте проект Asp.net MVC и EntityFramework для использования Redis в качестве поставщика кэша - PullRequest
0 голосов
/ 03 мая 2018

Я хочу использовать 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 как МОК.

Теперь у меня есть 2 вопроса:

  1. Как мне настроить EF в моем проекте для использования Redis в качестве кэша второго уровня поставщика (я использую этот пакет)?
  2. Можно ли использовать сохраненные данные в кеше (Redis) таким образом в отдельном проекте на моем компьютере (Совместное использование кеша приложения MVC несколькими приложениями)?

1 Ответ

0 голосов
/ 03 мая 2018

Redis в StructureMap

В StructureMap достаточно кода для регистрации этой службы. Синглтоны немного отличаются в этой системе, и вам лучше использовать «фабричный» шаблон для создания и управления вашим Redis-кешем. У SM есть автофабрика , которая сделает свое дело.

Если хотите, я могу опубликовать здесь базовый код. Но - вам нужно протестировать в вашей среде, чтобы заставить его работать (я не фанат размещения теоретического кода здесь в стеке).

Если вы раньше не использовали redis, я бы создал консольное приложение и удостоверился, что вы можете его настроить и запустить, прежде чем вставлять IOC и ваше приложение .Net MVC в рисунок (вы сильный кодер, так что я не скажу тебе кое-что, чего ты там еще не знаешь).

Могут ли другие ваши приложения использовать кэш Redis?

Да. Пока они имеют доступ к создаваемой вами конечной точке (в приведенном выше коде она прослушивает localhost:6379).

Вы можете просто использовать ту же настройку «config», что и в своем приложении MVC. Когда вы это сделаете, оба приложения попадут на один и тот же сервер «redis» и будут использовать одни и те же кэшированные объекты.

Думайте о redis так же, как вы думаете о своей базе данных: если обе системы используют одну и ту же «конфигурацию» (например, строку подключения), они могут получать доступ к одним и тем же данным.

Redis супер-быстрый и действительно крутой. Тебе это понравится!

Образец кода, полностью не проверенный

Вот краткий обзор, чтобы мой комментарий по структуре кода имел больше смысла. Если у других есть предложения по настройке, не стесняйтесь добавлять к комментариям, и я буду обновлять.

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>();

}   
...