/ php

Redis: что и зачем?

Redis - это хранилище данных, которое сохраняет данные в оперативную память. Это даёт ощутимый прирост в скорости, по сравнению с реляционными базами данных. Redis, благодаря своей структуре, можно использовать как базу данных, систему кэширования, или посредником сообщений. Ещё, это система, которая поддерживает множество разных типов данных: строки, списки, хеши, множества, сортированные множества. В этой статье, рассмотрим, как пользоваться redis, и самые используемые команды redis, с примерами и описанием.

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

Применение Redis в актуальном программировании очень широкое. Redis используют для кэширования, для "общения" с сокетами, или как БД. Сейчас же, рассмотрим, что такое кэширование, и как оно совместимо с redis-ом. Но, перед тем, как начать читать эту статью, советую ознакомиться со статьёй о базовом кешировании на примере простого PHP-класса.

Что такое кэш?

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

Сложные вычисления внутри нашей системы всегда должны кэшироваться. То есть, помимо алгоритмов вычисления, разработчику, так же нужно предусмотреть алгоритм кэширования. Тогда процесс получения данных будет представлять из себя цепочку действий:

  • проверка, существует ли вычисление в кэше, и подходит ли оно по параметрам
  • если кэш не найден, то считаем, и значение добавляем в кэш
  • если найден, то отдаём из кэша, экономя время, которые было бы потрачено на расчёт

Вот представьте, что мы пишем парсер, который авторизируется на сайте vk.com, и парсит оттуда ссылки на все песни пользователя. С точки зрения математики - несколько секунд на авторизацию, и несколько секунд на поиск нужных данных, добавим к этому несколько пользователей, и при их одновременном запросе - получим постоянно "что-то считающий" скрипт с временем ответа овердохрена. К тому же, пользователи будут тАить на глазах, когда при обновлении страницы запрос будет выполняться по 5 секунд. И, очевидно, что в такой системе, кэширование просто необходимо. В итоге, когда пользователь сделает запрос, то результат закэшируется, и дальнейшие обращения по этому запросу будут отдаваться из памяти. И теперь, скорость генерации данных ограничивается только скоростью работы системы кэширования.

Но почему именно Redis?

  1. Redis написан на C, что приносит высокую производительность.
  2. Redis используют такие титаны веба, как: GitHub, Pinterest, StackOverflow, что доказывает его надежность.
  3. Использование Redis убирает нужду в большом количестве запросов к БД, или постоянном пересчёте одних и тех же данных. Что повышает возможности при старом "железе".
  4. Redis - freendly-система для программистов. Redis поддерживается во многих языках программирования: PHP, NodeJS, Java, C, C++, Go...
  5. Redis имеет открытых исходный код, большое сообщество, и стабильность работы.
  6. Redis - мейнстримный. Его знание требуют в многих компаниях. Потому, вы, зная его, повышаете свою ценность.
  7. Что ещё вам нужно, чтобы попробовать?

Пример использования redis

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

Как обычно, я буду использовать vagrant, если вы ещё не знакомы с ним, то прочитайте эту статью

В консоли виртуальной машины я перехожу в контекст Redis-cli командой redis-cli, и теперь можно вводить Redis-команды.

Теперь, в консоли должно работать удобное автодополнение команд. Начнём вводить команду:

SET - установка значения**

Введя только команду SET я получил подсказку, в виде возможных аргументов.
set
key - это ключ, по которому мы сможем получить значение (как в ассоциативном массиве)
value - значение, которое будет доступно по этому ключу
EX seconds - это время, по истечению которого эти данные удалятся (секунд)
остальные сейчас не так важны

Теперь попробуем добавить новое значение:
SET first 'Hello Redis'
И получим:
hello_set_redis

А теперь, попробуем добавить значение, которое станет недоступным через 10 секунд:
SET second 'Hello Redis. In 10 sec you will be destroy' EX 10

Будьте внимательны. Для того, чтобы задать аргумент времени, перед числом пишется приставка EX

И по истечению 10 секунд, попытавшись получить это значение, получим (nil):
set_10

GET - получение значения

GET - это получение значения по ключу.
Мы выше уже пользовались этой командой, для демонстрации работы времени жизни значения.
Сейчас попробуем получить ранее созданное, первое значение:
GET first

И получим:
GET-by-key
В отличии, от второго, время жизни которого вышел.

DEL - удаление по ключу

DEL - это удаление значения по ключу. Попробуем удалить первое значение (first):
DEL first

И посмотрите, что из этого вышло:
DEL

Здесь были рассмотрены основные команды для работы с Redis. Все команды можете посмотреть на сайте официальной документции.

Короче говоря - Redis крутая штука:). Помимо его очевидного преимущества в скорости, он так же реализует в себе механизм времени жизни данных, что позволяет программисту переложить ответственность об проверке и подсчетё срока жизни данных на сам Redis.