Кеширование в Битрикс
NoSQL
означает не только SQL
и это потому, что видов NoSQL
используемых в индустрии довольно много. Работают они по-разному, но многие из них могут преминяться для одних и тех же задач.
В своей работе я применяю Redis
, служит для хранения записей ключ-значение, может использоваться для различных задач, включая кеширование, логирование, очереди, временные и постоянные значения, в том числе обновляемые. Хранит данные в оперативной памяти, так что для надёжности хранения нужна дополнительная логика по сохранению данных на носитель периодически, либо по вызову
событий. Массивы данных могут храниться в виде json
строк.
Установка Redis
Актуальная информация на текущий момент времени всегда обновляется, я рекомендую нагуглить информацию но прежде всего смотреть в оригинальной доке Redis. На данный момент годится эта статья.
Если хотим установить Redis
не на отдельный сервер, а на машину, нам нужно
добавить репозиторий Extra Packages для Enterprise Linux (EPEL):
yum install epel-release
Далее нужно запустить установку самого Redis
на сервер:
Redis
yum install redis -y
Поскольку ПО обновляется довольно часто, вполне возможно потребуется установить что-то дополнительно, нужно следовать инструкциям в консоли и гуглить возникающие ошибки, если таковые возникают.
После установки нам нужно запустить БД и автоматизировать её запуск при включении сервера:
sudo systemctl start redis.service
sudo systemctl enable redis
Успешно запущенный сервис Redis
можно проверить командой:
redis-cli ping
Безопасность
Безопасность при удалённом и локальном доступе эффективный способ защитить Redis
– защитить сервер, на котором он работает, что вполне логично. Firewall
и белый список IP
неоспоримо необходимые вещи для этого.
Конфигурационный файл Redis
находится и правится с помощью редактора nano
:
nano /etc/redis.conf
Для локального хоста нужно просто раскомментировать строку bind 127.0.0.1
, если нужен внешний ip
, прописываем его.
Redis
использует порт 6397
по умолчанию, при тонкой настройке файрвола и других сетевых настроек нужно это учитывать.
Настройка пароля Redis
находится в том же конфигурационном файле:
nano /etc/redis.conf
Находим и раскомментируем строку:
# requirepass foobared
Пароль можно шифровать и писать что-то сложное, но при этом главное не обмануть самого себя:
echo "password123456" | sha256sum
После установки пароля, сервис также нужно перезапустить, как после установки, мы уже автоматизировали его запуск, так что достаточно:
sudo systemctl restart redis.service
Проверяем пароль, переходим в командную строку Redis командой:
redis-cli
В виде теста пробуем указать ключ-значение:
set key1 10
Если получили ошибку NOAUTH Authentication
required
, всё работает, пробуем авторизоваться командой, в ответ на которую должны получить OK
:
auth ваш_пароль
Если всё действительно хорошо, мы можем покинуть управление Redis
:
exit
Получение доступа в PHP
Известных решений для проектов на php несколько, но я всегда выбираю phpredis
который доступен на github
Для работы нам потребуется установить pecl
:
yum install php-pear php-devel
Следом проводим манипуляции с репозиторием и собираем из
него действующий phpredis
:
git clone https://github.com/phpredis/phpredis.git
cd phpredis
phpize
./configure [--enable-redis-igbinary] [--enable-redis-
msgpack] [--enable-redis-lzf [--with-liblzf[=DIR]]] [--
enable-redis-zstd] [--enable-redis-lz4]
make && make install
Устанавдиваем:
yum install php-pecl-redis
Работа с phpredis
На этом этапе, нужно перейти к документации на гитхабе и начинать работу API.
Методы работы с phpredis
описаны в документации, либо легко гуглятся.
<?php
//$myRedis = new Redis();
$myRedis = new Redis([
'host' => '127.0.0.1',
'port' => 6379,
'connectTimeout' => 2.5,
'auth' => ['phpredis', 'phpredis'],
'ssl' => ['verify_peer' => false],
'backoff' => [
'algorithm' =>
Redis::BACKOFF_ALGORITHM_DECORRELATED_JITTER,
'base' => 500,
'cap' => 750,
],
]);
Очистка всех ключей в БД:
$redis->flushAll();
Аналитика:
$redis->info();
Сохранение на диск:
$redis->save();
Таймстамп последнего:
$redis->lastSave();
Сохранение данных в БД:
$redis->set('key', 'value');
Чтение данных из БД:
$redis->get('key');
Методов множество, методы поддерживают параметры, удаление по истечению времени и многое другое, возможностей очень много.
Именование ключей
Взять за хорошую практику, стоит правильное именование
ключей, если нет опыта работы с nosql
,
нужно привыкнуть.
В работе нужно использовать именование ключей выраженное смыслом того, за что ключ отвечает:
домен_сервис_параметр
Привмер:
sinteclubricantsru_detailpage_product123456
Для строковых и числовых данных, в value
значение подставляется и читается как есть. Массивы отправляем и читаем в value
с помощью
json json_encode
и json_decode
соответственно.