Статьи

Lovely Cache Love-in

Одна из самых больших привлекательностей ASP.NET для меня — это большие возможности кеширования. Вы можете отправить любой объект в кеш, установить срок его действия и вызвать его всего несколькими строками кода.

Для быстрого ознакомления, вот как вы используете объект Cache:

Чтобы поместить объект в кеш, скажем, содержимое метки:

Cache [«mylabeltext»] = Label1.Text;

Чтобы позже вспомнить кэшированное значение:

if (Cache [«mylabeltext»]! = null)
{
Label1.Text = (string) Cache [«mylabeltext»];
}

Теперь это хорошая вещь!

Но одна вещь ускользает от меня, и я не уверен, почему функциональность, по-видимому, не существует. Как перебрать объект Cache?

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

if (Cache [«search» + searchQuery]! = null)
{
// кеш вывода
}

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

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

Я просто не понимаю, почему итератор не был реализован в Cache. Может быть, я упускаю что-то очевидное …

Есть идеи, дорогие Sitepointers? 🙂

Обновить

DHTMLgod обнаружил GetNumerator в объекте Cache:


Dim objCacheItems As Collections.IDictionaryEnumerator
objCacheItems = Cache.GetEnumerator
While objCacheItems.MoveNext
Response.Write(objCacheItems.Key)
End While

Хорошая работа, парень! Я уверен, что AutoComplete скрывал это … 🙂

Быстрое добавление!

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

Он кэширует результаты из базы данных, DataSet, а затем обрабатывает информацию, чтобы представить ее на странице. Так:

Запрос -> Уровень кэша -> Уровень представления -> Ответ

Дело в том, что гораздо быстрее просто кэшировать на уровне представления … в конце концов, этот вывод вы хотите сохранить. Конечно, если вам нужно сохранить структуру, которая используется для построения презентации и которая может измениться, вы можете кэшировать как структуру, так и презентацию. Таким образом, вместо ситуации, которая была ранее, кэширование DataSet, вместо этого, слой Cache вернул бы строку или StringArray и т. Д. С фактическим содержимым для отображения, что означает, что уровень представления может быть обойден:

Запрос -> Уровень кэша -> Ответ

Некоторым это может показаться очевидным, но такие недостатки дизайна легко сделать.