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

Вчера я провел некоторое время, думая о кешировании.

Конкретно кеширование данных.

Я использую 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 ключ к каждому элементу кэша?

0 ответов

Другие вопросы по тегам