Одна из самых больших привлекательностей 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 и т. Д. С фактическим содержимым для отображения, что означает, что уровень представления может быть обойден:
Запрос -> Уровень кэша -> Ответ
Некоторым это может показаться очевидным, но такие недостатки дизайна легко сделать.