Как кэширование обнаруживает сложные изменения объектов и эффективно обновляет данные кэша

По умолчанию ASP.NET использует кэш памяти, поэтому похоже, что он использует Dictionary‹› внутри для использования пар ключ-значение. Но внешние решения для кэширования, такие как кэш Azure или другие, сериализуют данные, что отличает сценарий от решения в памяти. В приведенном ниже примере я держу объект списка с ключом и обновляю его.

var users = new List<User>();
HttpContext.Cache.Insert("key", users);
users.Add(new User());//cached list will update itself with this insertion ?
var cachedUsers = (List<User>) HttpContext.Cache["key"];// now i got users list object reference or copied users list without inserted user ?

Как я прокомментировал строки, если в этом сценарии используется решение по умолчанию для кеша памяти ASP.NET, поэтому ясно, что кеш содержит ссылку на список пользователей, но ответы меняются, если я использую внешнее решение кеша, такое как решение кеша Azure. Каковы ответы на приведенные ниже вопросы, если используется внешнее решение, которое сериализует объекты вместо кэширования ссылок на объекты?

Кэшированный список будет обновляться этой вставкой?

если я верну данные из кеша, это будет ссылка на объект списка пользователей или скопированный список пользователей без вставленного пользователя?


person Freshblood    schedule 13.03.2014    source источник


Ответы (1)


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

В любом случае полагаться на то, что значения вашего кеша обновляются после его вставки в ваш кеш, - плохая практика. Что, если вы захотите позже перейти на другой тип кеша? Когда данные, которые вы кешируете, изменяются, вы делаете свой кеш недействительным и заполняете его заново. Не полагайтесь на реализацию.

person Menno van den Heuvel    schedule 13.03.2014
comment
Что делать, если у меня есть сценарий для добавления или удаления объекта списка в каком-то сценарии, поэтому мне нужно обновить весь список в кеше? Таким образом, обновление очень большого списка только для одной операции добавления или удаления не повлияет на производительность? - person Freshblood; 13.03.2014
comment
Если у вас есть большой список, который нужно часто обновлять, возможно, он просто не подходит для кэширования. - person Menno van den Heuvel; 13.03.2014
comment
Есть идеи, как эффективно справиться с этим сценарием? - person Freshblood; 13.03.2014
comment
Может быть, не обязательно, чтобы данные всегда были актуальными, и в этом случае вы можете периодически обновлять кеш. Вам всегда нужен весь список? Возможно, вы можете кэшировать элементы по отдельности или в соответствии с нужными вам подразделами. Таким образом, обновление кеша может быть быстрее и не должно происходить так часто (при условии, что вы напишете умную логику аннулирования). - person Menno van den Heuvel; 13.03.2014