Использование Redis

В этой статье мы расскажем что такое Redis, его преимущества и для каких целей он используется.

Redis (REmote DIctionary Server) — сетевое журналируемое хранилище данных типа "ключ" — "значение" с открытым исходным кодом. По сути Redis представляет собой базу данных (как MySQL), только упрощенную и более быструю за счет отсутствия связи между данными, а также простому механизму работы с данными (подход noSql).

По принципу работы Redis схож с Memcached - данные также хранятся в оперативной памяти, доступ к данным осуществляется по ключу, однако Redis имеет ряд существенных отличий:

  • в Redis данные можно сохранять на диск, что позволяет снизить вероятность потери данных при аварийном завершении;
  • помимо хранения строк (strings), есть возможность хранить такие типы данные, как списки (lists), множества (sets), хеш-таблицы (hashes), упорядоченные множества (sorted sets).

В Redis, как и в memcached, можно указывать время жизни данных. Существует два способа — "удалить в определенный момент времени" и "удалить заданный промежуток времени". По умолчанию все данные хранятся вечно.
Также Redis обладает одной интересной особенностью - он является однопоточным сервером.
Решение необычное, но оно имеет свои плюсы. Эта особенность обеспечивает атомарность операций, то есть Redis поддерживает транзакции (последовательное выполнение всех операций, либо ни одной), а также пакетную обработку команд (выполнение пакета команд, получение пакета результатов).
Из минусов можно было бы назвать медлительность запросов, но не в случае с Redis. Операции с данными выполняются очень быстро, в среднем можно сделать порядка 28 тысяч запросов в секунду.

Redis, за счет его высокой скорости работы, удобно использовать для хранения различных счетчиков, например, количества просмотров страниц сайта, или же каких-либо временных данных. Достаточно распространено хранение кеша сайта, хранение PHP-сессий.

Пример хранения PHP-сессии в Redis

В первую очередь нужно включить Redis. Сделать это можно в Панели управления аккаунтом, в разделе Сервисы. По умолчанию сессии хранятся в файлах. Эту информацию можно увидеть в секции session, вызвав PHP-функцию phpinfo.

Доступ к файлам в любом случае происходит медленней, чем к оперативной памяти, поэтому перенастроим хранение сессий в Redis.
Так же Redis периодически сохраняет данные на диск, что предотвращает потерю данных.
Если по какой то причине Redis будет недоступен - хранение сессий автоматически переключится на файловое хранилище.
Для того чтобы включить хранение сессий в Redis добавим следующие строки в файл .htaccess, который обычно находится в корневой директории вашего проекта. Если такого файла нет, то необходимо его создать.

php_value session.save_handler "redis"
php_value session.save_path "tcp://127.0.0.1:6379"

Первая строка определяет имя обработчика хранения сессий.
Вторая определяет путь для хранения сессий. Redis работает как демон на стандартном порту, поэтому указываем

  • - протокол: tcp
  • - адрес: 127.0.0.1
  • - порт для подключения: 6379

Либо включить опцию в разделе "Сайты", вышеописанные опции в таком случае будут применены к сайту автоматически


Также включить хранение сессий в redis'е можно сразу для всех сайтов


Если на момент включения опции микросервис Redis отключен - он будет включен автоматически, с минимальным тарифом 1р./сутки.

После включении опции, в phpinfo, можно наблюдать что сессии хранятся в Redis:

Проверим результат с помощью тестового скрипта, который создает сессию:

<?php

session_start();
$count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;
echo $count; $_SESSION['count'] = ++$count;


Делаем запрос к скрипту:

ktulhu@ktulhu-H55M-S2V:~$ curl -I 'http://test50.bget.ru/test.php'
HTTP/1.1 200 OK
Server: nginx/1.9.5
Date: Wed, 11 Nov 2015 11:10:16 GMT
Content-Type: text/html
Connection: keep-alive
Keep-Alive: timeout=30
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.45
Set-Cookie: PHPSESSID=a902879490d11cb23e07e34cf303528f; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

Подключаемся к Redis и проверяем, что сессия сохранилась:

test50@tor:~$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION : a902879490d11cb23e07e34cf303528f"

Далее мы рассмотрим подключение Redis с целью кеширования данных в самых распространенных CMS.

Подключение Redis к Wordpress

Для подключения Redis к CMS WordPress в первую очередь необходимо зайти в административную часть сайта. В качестве примера рассмотрим домен my-site.com, в этом случае ссылка будет следующая: http://my-site.com/wp-login.php или http://my-site.com/wp-admin .
В административной панели следует выбрать пункт меню Плагины, затем подпункт Добавить новый.


На открывшейся странице ввести в поле поиска плагинов Redis.


Затем нажать "Установить" в окне плагина "Redis Object Cache", после чего появится сообщение о успешной установке плагина:


Затем следует перейти в раздел Плагины, подраздел Установленные, и активировать плагин.


Открыть настройки плагина - кнопка settings.


И включить.


После чего появится сообщение о том, что WordPress подключен к Redis:


Плагин установлен и активирован, осталось добавить нужные директивы в конфигурационный файл wp-config.php.
Сделать это можно через Файловый менеджер.
Открываем директорию сайта и нажимаем Править на нужном файле, в нашем случае это wp-config.php.


В открывшемся окне добавляем в начало файле следующие строки:

define('WP_CACHE_KEY_SALT', 'my-site.com');
define('WP_CACHE', true);

Где my-site.com - имя вашего сайта.
После чего нажимаем "Сохранить".

Готово, сайт полноценно работает с Redis.
Проверяем, что данные действительно пишутся в Redis:

127.0.0.1:6379> keys my-site.com*
1) "my-site.com_wp_user_meta:1"
2) "my-site.com_wp_:post_tag_relationships:1"
3) "my-site.com_wp_:transient:is_multi_author"
4) "my-site.com_wp_:category:1"
5) "my-site.com_wp_site-transient:update_core"
6) "my-site.com_wp_:transient:twentyfifteen_categories"
7) "my-site.com_wp_userslugs:testtest"
8) "my-site.com_wp_:widget:widget_recent_comments"
9) "my-site.com_wp_:transient:plugin_slugs"
10) "my-site.com_wp_useremail:test@test.test"
11) "my-site.com_wp_:posts:last_changed"
12) "my-site.com_wp_:options:alloptions"
13) "my-site.com_wp_:terms:last_changed"
14) "my-site.com_wp_:posts:1"
15) "my-site.com_wp_users:1"
16) "my-site.com_wp_:posts:wp_get_archives:53058f6b83972cfc3253e30ef06fcaa9:0.660622001447243344"
17) "my-site.com_wp_:post_meta:1"
18) "my-site.com_wp_userlogins:testtest"
19) "my-site.com_wp_site-transient:theme_roots"
20) "my-site.com_wp_:category_relationships:1"
21) "my-site.com_wp_:default:is_blog_installed"
22) "my-site.com_wp_:terms:get_terms:eccb28b0f03fa3589e317f658d286d32:0.661676001447243344"
23) "my-site.com_wp_:widget:widget_recent_posts"
24) "my-site.com_wp_:options:notoptions"
25) "my-site.com_wp_:terms:get_terms:28955b20311515a81c5f5c1ff65448e7:0.661676001447243344"
26) "my-site.com_wp_site-transient:update_plugins"
27) "my-site.com_wp_site-transient:update_themes"
28) "my-site.com_wp_:post_format_relationships:1"


Сделаем тест производительности с помощью утилиты Siege.
Результаты с отключенным Redis:

Transactions:		       10638 hits
Availability:		      100.00 %
Elapsed time:		      359.85 secs
Data transferred:	       27.66 MB
Response time:		        0.16 secs
Transaction rate:	       29.56 trans/sec
Throughput:		        0.08 MB/sec
Concurrency:		        4.85
Successful transactions:        8448
Failed transactions:	           0
Longest transaction:	       64.71
Shortest transaction:	        0.05

Результаты с подключенным Redis:

Transactions:		       11849 hits
Availability:		      100.00 %
Elapsed time:		      359.95 secs
Data transferred:	       30.89 MB
Response time:		        0.11 secs
Transaction rate:	       32.92 trans/sec
Throughput:		        0.09 MB/sec
Concurrency:		        3.49
Successful transactions:        9458
Failed transactions:	           0
Longest transaction:	        5.11
Shortest transaction:	        0.05

Видим, что среднее время на ответ сервера уменьшилось, а количество открытых страниц, в свою очередь, наоборот увеличилось.

Подключение Redis к Joomla

Для подключения Redis к CMS Joomla в первую очередь необходимо зайти в административную часть сайта:
http://my-site.com/administrator/.

В 3-ей ветке версии CMS Joomla уже есть возможность подключить хранение кеша в Redis.
Для включения в административной панели следует выбрать пункт меню Система, затем подпункт Общие настройки.


На открывшейся странице выбираем пункт меню Система.


Устанавливаем значение "кеш" в Стандартное кеширование.
Значение "обработчик кеширования" в Redis.
Остальные настройки подходят по умолчанию.


Сохраняем настройки.


Можно убедится, что данные теперь пишутся в Redis:

127.0.0.1:6379> keys *
1) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-_system-929adb9b368342c818ec393fb978a452"
2) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-mod_banners-e0e3e665a6ca401f75ee3e303709d106"
3) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-com_modules-569e6c47757760810bca0248ddf06827"
4) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-mod_menu-4e418acf0564bb68644330ec4571a4b1"
5) "f2742362a55de6e5aed0368990e6cb83-cache-mod_menu-417ea3f772f82269c74fd5192e9361e9"
6) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-com_languages-d5b1f17e45f67b7b5187f3a249a371d1"
7) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-mod_menu-e2577430251bc8a2d5fcbc24e2824f56"
8) "f2742362a55de6e5aed0368990e6cb83-cache-com_templates-227cec74b683e80b728884721655a1d6"
9) "0b4e10cc3e67426df1caf69c3c0a8bc5-cache-com_plugins-31f5657c977a543483097846ff8d47fd"


С помощью утилиты Siege проверяем, как изменилась скорость работы сайта.
Результаты с отключенным Redis:

Transactions:		        8165 hits
Availability:		      100.00 %
Elapsed time:		      359.51 secs
Data transferred:	       27.84 MB
Response time:		        0.33 secs
Transaction rate:	       22.71 trans/sec
Throughput:		        0.08 MB/sec
Concurrency:		        7.46
Successful transactions:        8165
Failed transactions:	          0
Longest transaction:	       54.82
Shortest transaction:	        0.07

Результаты с включенным Redis:

Transactions:		        9442 hits
Availability:		      100.00 %
Elapsed time:		      359.39 secs
Data transferred:	       28.89 MB
Response time:		        0.24 secs
Transaction rate:	       23.49 trans/sec
Throughput:		        0.08 MB/sec
Concurrency:		        7.85
Successful transactions:        9442
Failed transactions:	          0
Longest transaction:	        8.68
Shortest transaction:	        0.05


Из всего вышесказанного можно сделать вывод, что Redis является прекрасным инструментом для работы с данными и в умелых руках может существенно улучшить производительность сайта.





Удачной работы! Если возникнут вопросы - напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел "Помощь и поддержка".