У меня такая же проблема. Я не знаю, если вы нашли решение, но пока у меня есть временное решение (потому что это не очень эффективно):
Создание каталога кэша для каждой таблицы вы собираетесь запрашивать и кэширование результатов.
Всякий раз, когда вы запрашиваете эту таблицу, сохраните результат, используя уникальный идентификатор. Вот проблема с моим решением. Вы не можете использовать запрос как идентификатор, так как он может быть слишком длинным, и некоторые операционные системы могут его отклонить. Так что я придумал, чтобы хранить все запросы в другом файле вместе с автоинкрементным идентификатором, например:
0->>SELECT * FROM table
1->>SELECT * FROM table WHERE foo = bar
Вы получаете идею. Поэтому перед выполнением запроса проверьте этот файл, чтобы увидеть, есть ли текущий запрос, если он есть, получить идентификатор и загрузить его с помощью этого идентификатора. Вы можете сохранить этот файл в том же каталоге кеша.
- Всякий раз, когда вы обновляете, вставляете или удаляете данные в этой таблице, просто очищайте кэшированные записи следующим образом: $ cache-> clean ('all'). Вам не нужно удалять файл id, так как будут выполняться одни и те же запросы. И в случае, если вам интересно, оно очистит только файлы кеша в этом каталоге, следовательно, потребуется каталог для каждой таблицы.
В хорошем состоянии. Вам даже не нужно устанавливать срок службы (они могут существовать вечно) или автозабор для кэша ur, поскольку вы очищаете его самостоятельно, когда запускаете обновление, вставляете или удаляете.
Уродливые. Любой тест, загрузка или сохранение заставят два (или три, когда нам нужно сохранить новый идентификатор для нового запроса) запросы к файловой системе.
Я использовал это, и он отлично работает, используя Zend_Cache_Core и Zend_Cache_Backend_File. Я не использую полный фреймворк, но я использую модуль Zend_Cache, поэтому, если вы используете всю структуру, вам может понадобиться создать абстрактный класс модели, который будет создавать каталоги, файлы id и кэширование для ваших дочерних классов модели (который затем расширит его).
Я видел здесь, что использование md5 может быть решением для создания файла id для каждой таблицы. Я попробую и вернусь к тебе. Я не знаю, как это будет работать с Apc.
Точка Zend_Cache - это удаление нагрузки из базы данных с использованием memcache или бэкэнда APC. Простое извлечение данных с помощью ключа происходит намного быстрее, чем ожидание заблокированных таблиц или относительно сложных запросов. Разумеется, это означает, что при разработке приложения затрачивается больше времени, поскольку вам необходимо очистить кеш при изменении данных. Это баланс! В целом, есть большие выгоды, которые нужно сделать - это причина, по которой данные кэширования лучших сайтов! –
ОК, но какие идентификаторы кэша вы могли бы очистить с помощью сериализации (func_get_args()), когда какая-то часть данных изменится? Как нет, нет никакого способа узнать. Таким образом, либо улучшите свой метод, либо используйте кеширование на стороне базы данных. Мы спорим, но ни один из нас не дал полезный ответ! –
Zend_Cache поддерживает тегирование, поэтому вы можете пометить записи, а затем удалить их соответствующим образом. В качестве альтернативы вы можете использовать короткий TTL для данных. Я пытаюсь сказать, что есть разные способы кэширования вещей в разных обстоятельствах. Кэширование - ОЧЕНЬ конкретное приложение. Вы поднимаете очень верный вопрос о возможности удаления устаревших записей! В дополнение к этой стратегии можно использовать кеш запросов. –