В чем преимущество redis’а в качестве хранилища кэша?
Redis
Итак, для начала устанавливаем redis. (если у вас windows, то можно скачать инсталлятор отсюда )
Поскольку сервер будет использоваться для хранения кэша данных, то настроим в конфиге максимальный объем используемой памяти:
и политику вытеснения из памяти:
данная политика означает, что при нехватке выделенной памяти для новой записи, будут выброшены записи, время жизни которых наиболее приближено к окончанию.
PHP
Для работы с redis в PHP необходимо установить расширение (под windows готовые DLL можно взять отсюда )
Если нет возможности установить дополнительные модули, то можно через composer установить . Использование Predis не требует никаких дополнительных модулей, но надо будет изменить несколько строк в примере. Мне показалось, что работа с скомпилированными библиотеками будет быстрее, чем полностью интерпретаторная реализация общения с редисом.
Bitrix
Создаем php файл (отдельный или в составе собственного модуля) где будет размещаться наш класс ‘CPHPCacheRedis’. В файле .settings, в разделе ‘cache’ вместо строки ‘type’ указываем массив:
Для указания адреса сервера зададим константы в dbconn.php
к посту приложен устаревший файл (почему-то не удаляется) актуальный модуль выложен на GitHub .
Очистка кэша (cleanDir)
При кешировании в битриксе используются три уровня:
Однако redis позволяет получить список ключей по маске, поэтому в моем примере я удаляю все ключи, соответствующие маске удаляемого уровня, а потом уже удаляю саму запись
К сожалению у меня нет задач с огромным количеством кэшей, чтобы замерить сильно ли упадет производительность при очистке. Если есть необходимость использовать классический подход битрикса, то можно оставить только
Модуль выложен на GitHub
- быстрое хранилище в памяти;
- несколько серверов redis могут быть объединены в кластер;
- несколько web-серверов могут подключаться к одному серверу redis;
- можно сбросить кэш на диск, чтобы не потерять его при перезагрузке;
- различные модели вытеснения лишнего кэша;
Redis
Итак, для начала устанавливаем redis. (если у вас windows, то можно скачать инсталлятор отсюда )
Поскольку сервер будет использоваться для хранения кэша данных, то настроим в конфиге максимальный объем используемой памяти:
maxmemory 100mb |
maxmemory-policy volatile-ttl |
PHP
Для работы с redis в PHP необходимо установить расширение (под windows готовые DLL можно взять отсюда )
extension=php_igbinary.dll extension=php_redis.dll |
Bitrix
Создаем php файл (отдельный или в составе собственного модуля) где будет размещаться наш класс ‘CPHPCacheRedis’. В файле .settings, в разделе ‘cache’ вместо строки ‘type’ указываем массив:
'type' => array( 'class_name' => 'CPHPCacheRedis', 'required_file' => 'modules/bars46.rediscache/include.php' ) |
Для указания адреса сервера зададим константы в dbconn.php
define("BX_REDIS_IP", '127.0.0.1');
define("BX_REDIS_PORT", '6379'); |
Очистка кэша (cleanDir)
При кешировании в битриксе используются три уровня:
- basedir
- initdir
- filename
- запись с ключом basedir, которая содержит рандомный хэш basedir_version
- запись с ключом basedir_version . "|" . init_dir , которая содержит рандомный хэш initdir_version
- и собственно наша запись с ключом basedir_version . "|" . initdir_version . "|" filename , содержащая кэшируемые данные
- очищает запись с ключом basedir_version . "|" . init_dir (в случае с cleanDir)
- очищает запись с ключом basedir (в случае с «очистить кэш» из админки)
Однако redis позволяет получить список ключей по маске, поэтому в моем примере я удаляю все ключи, соответствующие маске удаляемого уровня, а потом уже удаляю саму запись
$keys = self::$obRedis->keys(self::$basedir_version[$basedir] . "|*"); self::$obRedis->del($keys); self::$obRedis->del($this->sid . $basedir); |
К сожалению у меня нет задач с огромным количеством кэшей, чтобы замерить сильно ли упадет производительность при очистке. Если есть необходимость использовать классический подход битрикса, то можно оставить только
self::$obRedis->del($this->sid . $basedir); |
Модуль выложен на GitHub