В этой статье мы расскажем что такое 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 отключен – он будет включен автоматически, с минимальным тарифом 2р./сутки. Клиентам выделенных серверов Redis предоставляется без дополнительной платы.
После включении опции, в 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 в первую очередь необходимо добавить нужные директивы в конфигурационный файл wp-config.php.
Сделать это можно через Файловый менеджер.
Открываем директорию сайта и нажимаем Править на нужном файле, в нашем случае это wp-config.php.
В открывшемся окне добавляем в начало файла, как показано на снимке экрана ниже, и строго после первой строки с `<?php` следующие строки:
define('WP_CACHE_KEY_SALT', 'my-site.com_');
define('WP_CACHE', true);
Где ‘my-site.com_’ – имя вашего сайта, или уникальный префикс для хранения данных в Redis, что важно при использовании Redis для нескольких сайтов.
После чего нажимаем “Сохранить”:
Теперь нужно зайти в административную часть сайта.
В качестве примера рассмотрим домен my-site.com, в этом случае ссылка будет следующая: http://my-site.com/wp-login.php или http://my-site.com/wp-admin.
В административной панели следует выбрать пункт меню Плагины, затем подпункт Добавить новый.
На открывшейся странице ввести в поле поиска плагинов Redis.
Затем нажать “Установить” в окне плагина “Redis Object Cache”, после чего появится сообщение об успешной установке плагина:
Затем следует перейти в раздел Плагины, подраздел Установленные, и активировать плагин.
Открыть настройки плагина – кнопка settings.
И включить.
После чего появится сообщение о том, что WordPress подключен к Redis:
Готово, плагин установлен и активирован, сайт полноценно работает с 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 является прекрасным инструментом для работы с данными и в умелых руках может существенно улучшить производительность сайта.
Свежие комментарии