Redis и Yii2 - uniqcle/Yii2 GitHub Wiki

Вспомогательные пакеты

sudo apt update
sudo apt full-upgrade
sudo apt install build-essential tcl 

Качаем и распаковываем

cd project                                            # Идем в папку с проектом
curl -O http://download.redis.io/redis-stable.tar.gz  # Качаем редис
tar xzvf redis-stable.tar.gz                          # Распаковываем
cd redis-stable                                       # Переходим в папку redis-stable

Компилируем и устанавливаем

make              # Компилируем редис
make test         # Как скомпилируется, начинаем тестировать загруженный код командой
sudo make install #Если тестирование завершено успешно, то выполним установку командой

Настройка Redis

# Для начала создадим директорию, в которой будет хранится конфигурация. 
# Пусть это будет директория /etc/redis 
sudo mkdir /etc/redis 
# Теперь скопируем файл-образец конфигурации Redis из скаченного нами ранее архива Redis
cp redis.conf /etc/redis   
sudo nano /etc/redis/redis.conf #изменим там несколько моментов

supervised no ---> supervised systemd

dir ./ ---> dir /var/lib/redis

В этом файле находим опцию supervised. По умолчанию она выставлена в no.

Так как мы используем ОС (убунту), где все службы запускаются службой systemd (link is external), то изменим значение данной опции на systemd -- чтобы наш файл /etc/redis/redis.conf выглядел как-то так

. . .......
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

Далее находим опцию dir в том же файле (опция показывает редису, где хранить свои постоянные данные). Нужно какое-нибудь место, где Редис имеет права на запись, а обычные пользователи не могут просматривать -- будем использовать директорию для этого директорию /var/lib/redis (создазим её чуть позже, а пока просто измените значение опции в файле) - то есть должно стать как-то так:

...
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis
...

Также можно раскомментировать опцию maxmemory 128 mb

Создаём для Redis файл модуля (systemd)

Далее создадим конфигурационный файл, с помощью которого система сможет руководить процессом Redis. Создадим и откроем файл:

sudo nano /etc/systemd/system/redis.service

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

Создаём пользователя, группу и директории для процесса (службы) Redis

sudo adduser --system --group --no-create-home redis  # Создаём одноимённых пользователя и группу с именем redis
sudo mkdir /var/lib/redis             # Далее создадим директорию /var/lib/redis командой
sudo chown redis:redis /var/lib/redis # Далее дадим юзеру и группе redis права владельцев данной директории
sudo chmod 770 /var/lib/redis         # Выставим права так, чтобы обычные пользователи не имели доступа к этой директории

Запускаем и проверяем работоспособность

Запускаем Redis Service (службу)

sudo systemctl start redis   # Запускаем службу редиса через systemd командой
sudo systemctl restart redis 
sudo systemctl stop redis
sudo systemctl status redis  # Убеждаемся, что сервер запустился без ошибок командой
sudo systemctl enable redis  # Добавляем Redis в автозагрузку

Тестируем подключение к серверу и его работу

redis-cli    # Чтобы убедиться, что с сервисом всё ок, запустим программу-клиент
ping         # Проверка. Должен быть ответ PONG
info         # Вся информация
info memory  # Информация по памяти

Команды

set test 100 # Установка значения
get test     # Получение значения
set testing "working"
get testing
del testing  # Удаление значения
FLUSHALL     # Полная очистка кэша

Redis и Yii2

Вставить конфиг в common/config/main-local.php

 'cache' => [
            'class' => 'yii\redis\Cache',
        ],
        'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => 'localhost',
            'port' => 6379,
            'database' => 0,
        ],

Установка библиотеки Redis для yii2:

composer require --prefer-dist yiisoft/yii2-redis

Если композер попросит токен, перейти по этой ссылке и на гитхабе сгенерировать его и вставить в консоль https://github.com/settings/tokens/new?scopes=repo&description=Composer

Пример кода

namespace frontend\controllers;

use yii\web\Controller;
use frontend\models\Sale;
use yii\helpers\ArrayHelper;

class SaleController extends Controller
{
    public function actionIndex(){

        $sale = \Yii::$app->cache->get('sale'); //Получаем кэш
        if(!$sale) {  //Если кэша нет, то получаем данные
            $sale = ArrayHelper::getColumn(
                Sale::find()->select(['date', 'value'])->asArray()->all(), 'value'
            );

            array_walk($sale, function (&$item) {
                $item = floatval($item);
            });
         \Yii::$app->cache->set('sale', $sale, 60*2);  //Устанавливаем кэш. 3-й параметр время
        }
        
        return $this->render('index', [
            'sale' => $sale
        ]);
    }
}