Сам по себе доступ к файлам на сервере быстрый, и там вполне можно кэшировать нужные нам данные. Но тогда почему, все переходят на memcached et cetera? Потому что файловая система не приспособлена для поиска информации, а значит если нам надо сделать какую-то выборку по кешу, сервер будет перебирать все файлы, а их может быть тысячи, а то и десятки.
Значит, чтоб сделать быстрый кеш на файлах, надо научить файловую систему производить поиск или индексировать структуру. Для начала разделим Кеш от его мета представлений – будем хранить 2 файла в одном чистый контент в другом информацию об этом кеше такую как тип, время актуальности, мд5 хеш для валидности. Все мы знаем, надеюсь, что большинство файловых систем тормозят, если в одной папке большое количество файлов, поэтому чтоб снять это добавляем переменную, отвечающую за создание подпапки в которой он будет храниться путем взятия хеша от ключа и по первым буквам определяем путь – например /a/d/4/s
Далее разделяем кеш еще на 2 директории – тот, который вечен и тот, у кого есть актуальное время. Зачем? Для того чтоб при выборке еще сузить нужную область поиска.
А теперь самая сложная операция выборка по тегам. Для тегов создадим отдельную директорию и отдельный файл с ключами, и в корне создадим хитрые папки каждая из которых будет в своем названии хранить информацию о тега – собранных вместе и разделенных сепаратором указанным нами к константах. Вид папки будет примерно такой:
^some_tag^^_another_tag^
И когда нам надо будет найти что-то по тагам, мы, пройдясь по этим корневым папкам, узнаем всю инфу очень быстро, а внутри этих папок встретим знакомую нам систему хеш-ключа, которую мы пропустим через glob, чтоб сразу добраться до ключей кеша!
И того при такой структуре даже на 200.000 файлах, поиск по тегам сам по себе занимает миллисекунды. Zend_Cache::File же будет перебирать каждый файл и смотреть какие теги у него есть.
Исходный код можно скачать - тут.
В этом разделе:
- √Немного о создании высоконагруженных проектов
- √Быстрый кэш на файлах. Миф или реальность?
