Создайте пользовательский элемент управления или кэш страницы для содержимого кэшированного словаря.
Вчера я провел некоторое время, думая о кешировании.
Конкретно кеширование данных.
Я использую ASP.NET 4.0, кодирование в VB. Я использую базу данных MySQL, поэтому не могу использовать SQL Server только для sqlDependency.
Для меня важно, чтобы все изменения данных выполнялись, и ни один пользователь не видел старые данные, поэтому мне пришлось придумать что-то, чтобы отслеживать изменения базы данных по конкретным таблицам.
Что я придумал, так это...
1: подпрограмма, которая создает словарь ключей / значений в кэше, который содержит имена таблиц, в которые недавно были записаны данные, и метку времени записи, т.е.
tableName | timeStamp (Unix)
table2Name | timeStamp
2: общедоступная функция, которая вызывается при записи любых данных, т.е. все команды INSERT, UPDATE или DELETE создаются путем передачи двух аргументов этой функции, sql
а также tableChanges
,
В этой функции sql
это просто код ОБНОВЛЕНИЕ / ВСТАВКА и tableChanges
список имен таблиц, разделенных запятыми, которые будут затронуты этой командой
Во время любой поправки создается таблица в пункте 1.
3: общедоступный getData
функция, которая принимает аргументы:
cacheName As String - the cache key name
slidingTime As Double - sliding expiry period (converted to minutes within the function)
dependancy As Object - standard cache dependancy object
newSql As String - the query required to get this data
Optional tableDependencies As String = "" - a comma separated list of tables which this data is dependant on
4: функция для записи объекта данных в кэш на основе аргументов, аналогичных приведенным выше.
Теперь функция #3 сначала проверяет, содержит ли кеш переданный в нее ключ, если нет, то просто отправляется в базу данных и получает новые данные.
Если он содержит этот ключ, то он делает две вещи, во-первых, он получает отметку времени, когда этот элемент был добавлен, что всегда cacheKey_added
(создается в процессе добавления элемента кэша), затем, получив эту метку времени, он берет запятую tableDependencies
, превращает его в список имен таблиц, просматривает их все, проверяя время обновления соответствующей таблицы (используя имя таблицы в качестве ключа) из кэшированных данных Dictionary
создан в первой функции.
Если какое-либо время обновления таблицы является более поздним, чем время кеширования, оно отправляется в базу данных и получает новые данные, если нет - возвращает кешированные данные.
Точно так же, если нет Dictionary
из таблиц, хранящихся в кеше, он возвращает кэшированные данные, поскольку предполагается, что никаких изменений не было сделано, поскольку этот объект кеша создается только тогда, когда в базу данных вносятся изменения.
Данные всегда хранятся в режиме скользящего кэша, обычно довольно короткого, и, конечно, данные, которые вообще не нуждаются в кэшировании, могут быть получены непосредственно без этого процесса.
Я не разместил код для любого из вышеперечисленного, так как он не обязательно относится к моему актуальному вопросу, но фон важен.
Итак, мой актуальный вопрос:
Учитывая, что вышесказанное прекрасно работает для определения того, когда какие-либо таблицы в моей базе данных изменились (при условии, что ничего не изменилось в phpMyAdmin, но так как только один человек имеет к этому доступ, в моем случае это нормально... как я могу применить тот же принцип кэшировать пользовательские элементы управления или страницы?
Итак, я кэшировал пользовательские элементы управления, используя VaryByParam="PARA"
а также VaryByCustom="CUSTOM_VALUE"
успешно в прошлом. Само собой разумеется, что VaryByCustom
это путь... но как бы я надежно передать параметры (имена таблиц и время последнего кэширования страницы) в пользовательскую функцию, чтобы сделать это... ИЛИ я говорю чепуху?!
Кроме того, есть ли способ получить время записи в кеш без необходимости сохранения дополнительного _added
ключ к каждому элементу кэша?