Нужно решение для кэширования для моего решения asp.net mvc

Мое приложение генерирует много объектов, делая это. Объекты генерируются в результате запросов к базе данных и являются частью нашего решения ORM. Программы, использующие эти объекты, обычно запрашивают их одну за другой.

Я хочу использовать System.Runtime.Caching, но не знаю, как это сделать, поскольку у меня есть определенные критерии:

Каждый пользователь может войти в другую базу данных. Применяется для всех объектов.

Базы данных могут иметь несколько разных профилей компаний. Применяется для большинства объектов.

Большинство объектов многоязычны.

Некоторые объекты кэшируются только во время выполнения транзакции базы данных, а затем выгружаются при откате или фиксации.

Первое решение, которое приходит на ум, — сгенерировать сложный строковый ключ для кеша (т. е. значение первичного ключа базы данных + компании + языка + объекта), но я не уверен, что это правильный путь. Я также не уверен, как реализовать кэширование транзакций.

Возможно, у меня было бы больше контроля над кешем, если бы я использовал свою собственную реализацию. Что-то вроде этого:

public class DatabaseCache
{
    private ConcurrentDictionary<string, ClassCache> m_databases = new ConcurrentDictionary<string, ClassCache>();

    public void Add(string database, string className, object item, params string[] itemKeys)
    {
    }
}

public class ClassCache
{
    private ConcurrentDictionary<string, KeyCache> m_cache = new ConcurrentDictionary<string, KeyCache>();

    public void Add(string className, object item, params string[] itemKeys)
    {
    }
}

public class KeyCache
{
    private ConcurrentDictionary<string, object> m_cache = new ConcurrentDictionary<string, object>();

    public void Add(object item, params string[] itemKeys)
    {
    }
}

person Nezreli    schedule 14.10.2013    source источник
comment
Какой ОРМ вы используете? некоторые поставляются с несколькими уровнями кэширования, которые вы можете использовать.   -  person user1450877    schedule 14.10.2013
comment
Это наша собственная ORM. Я разработал его 7 лет назад.   -  person Nezreli    schedule 14.10.2013
comment
Ну, вы пытаетесь решить очень сложную проблему, как вы, вероятно, знаете. Если бы я был на вашем месте, я бы посмотрел, как кэширование реализовано в других ORM с открытым исходным кодом, и посмотрел, применимы ли эти подходы ко мне.   -  person user1450877    schedule 14.10.2013
comment
Используются ли объекты, которые вы кэшируете, всеми пользователями или они предназначены только для отдельных лиц? Кэш обычно является глобальным, поэтому любой добавленный объект доступен для просмотра во всех сеансах. Если вы ищете кеширование данных для каждого пользователя, то сессия может быть лучшим хранилищем.   -  person Simon Halsey    schedule 14.10.2013
comment
Обычно ими пользуются все пользователи.   -  person Nezreli    schedule 15.10.2013


Ответы (2)


Я использую очень похожий подход в CMS, и он работает довольно хорошо (в CMS большинство объектов читаются много раз и записываются несколько раз).

Когда происходит обновление, кэшированные объекты становятся недействительными. В моей строке ключа кэша первым параметром является индекс кэша, который изменяется при обновлении.

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

Что касается кэширования всей транзакции, вы можете сохранить список со всеми ключами объектов транзакции.

В конце транзакции вы можете зациклить этот список и удалить все эти элементы из кеша.

Другой подход состоит в том, чтобы сохранить коллекцию объектов транзакций и сохранить объект коллекции в кеше. При таком подходе вам нужно удалить из кеша только объект коллекции.

person Tasos K.    schedule 14.10.2013

Учитывая все, что может различаться (база данных/компания/язык/первичный ключ), ваше решение использовать все эти вещи для создания уникального ключа для кэширования является разумным. Я использую очень похожую схему из одного из поддерживаемых мной приложений, и она работает без проблем.

person E.J. Brennan    schedule 14.10.2013
comment
Мне не нравится идея создания такой строки для каждого возможного запроса объекта, но, возможно, это необходимо. Проект Velocity, если я правильно помню, поддерживал теги в своем решении для кэширования. Выглядело красиво. - person Nezreli; 14.10.2013