Модуль Битрикс для использования Redis в роли сервера кеша
Итак, для начала устанавливаем redis. (если у вас windows, то можно скачать инсталлятор отсюда https://github.com/MSOpenTech/redis/releases)
Поскольку сервер будет использоваться для хранения кэша данных, то настроим в конфиге максимальный объем используемой памяти:
maxmemory 100mb
и политику вытеснения из памяти:
maxmemory-policy volatile-ttl
данная политика означает, что при нехватке выделенной памяти для новой записи, будут выброшены записи, время жизни которых наиболее приближено к окончанию.
Для работы с redis в PHP необходимо установить расширение https://github.com/phpredis/phpredis(под windows готовые DLL можно взять отсюда http://www.apachelounge.com/viewtopic...php?t=6359)
extension=php_igbinary.dll
extension=php_redis.dll
Модуль устанавливается обычным способом. Во время установки в файл .settings вносится настройка кеша:
'type' => array(
'class_name' => 'CPHPCacheRedis',
'required_file' => 'modules/{имя модуля}/include.php'
)
при деинсталляции модуля настройки возвращаются к типу кеширования "files"
По умолчанию для сервера Redis используются стандартные адрес 127.0.0.1 и порт 6397
Для ручного указания адреса сервера можно задать константы в dbconn.php
define("BX_REDIS_IP", '127.0.0.1');
define("BX_REDIS_PORT", '6379');
При кешировании в битриксе используются три уровня:
- basedir
- initdir
- filename
когда мы в первый раз делаем запись в кэш, то создаются 3 записи:
- запись с ключом basedir, которая содержит рандомный хэш basedir_version
- запись с ключом basedir_version . "|" . init_dir , которая содержит рандомный хэш initdir_version
- и собственно наша запись с ключом basedir_version . "|" . initdir_version . "|" filename , содержащая кэшируемые данные
При массовой очистке кэша, например функцией cleanDir или кнопкой очистки кэша из админки, битрикс поступает следующим образом:
- очищает запись с ключом basedir_version . "|" . init_dir (в случае с cleanDir)
- очищает запись с ключом basedir (в случае с «очистить кэш» из админки)
Таким образом записи типа filename остаются «бесхозными» и продолжают висеть в памяти пока не истечет их время жизни или они не будут вытеснены политикой ограничения размера памяти.
Однако redis позволяет получить список ключей по маске, поэтому в данном модуле все ключи, соответствующие маске удаляемого уровня, а потом уже удаляется сама запись
$keys = self::$obRedis->keys(self::$basedir_version[$basedir] . "|*");
self::$obRedis->del($keys);
self::$obRedis->del($this->sid . $basedir);