При работе над бэкэндом сколько-нибудь крупного проекта перед разработчиком рано или поздно встает вопрос выбора хранилища. На определенном этапе РСУБД перестает удовлетворять потребности проекта:
В вышеперечисленных случаях можно использовать key-value (далее "KV") хранилища.
Рассмотрим стандартный пример использования Redis как KV: хранение информации о сессиях пользователей. Когда пользователь авторизуется на сайте, генерируется идентификатор сессии и используется как ключ. В значении сохранятся идентификатор пользователя (user_id) и любая нужная персональная информация. Обычно сессия записывается в cookie браузера. После этого backend моментально определяет от какого пользователя пришел запрос.
Попробуем реализовать пример на практике. Представим, что пользователь с идентификатором 120 авторизовался, и серверу нужно создать для него сессию. Обычно идентификатор сессии состоит из большой рандомизированной строки. В данном уроке для простоты будет использоваться числовое представление.
Подключаемся к Redis серверу с помощью redis-cli и записываем значение user_id по ключу сессии:
127.0.0.1:6379> set session:1 120
OK
Команда записи в Redis имеет простую конструкцию:
set ключ значение
Сразу стоит обратить внимание на пару важных моментов:
session:{session_id}
.set
записывает значение как строку. Одиночное слово пишется без кавычек, но предложение придется писать в одинарных или двойных кавычках set key1 'hello world'
.Сессия сформирована и записана в Redis и cookie. Теперь при следующем запросе от клиента сервер увидит сессию и пойдет в Redis, чтобы определить пользователя:
127.0.0.1:6379> get session:1
"120"
Redis вернул строку, так как сессия существовала. Но что будет, если клиент пришлет несуществующую сессию?
127.0.0.1:6379> get session:N
(nil)
Вернется значение (nil)
, означающее отсутствие ключа.
Если необходимо проверить сессию на существование без получения идентификатора пользователя, то используется соответствующая команда:
127.0.0.1:6379> exists session:1
(integer) 1
127.0.0.1:6379> exists session:N
(integer) 0
Если ключ существует, Redis возвращает целое число 1. В противном случае вернется 0.
При выходе из аккаунта сессия пользователя должна удаляться:
127.0.0.1:6379> del session:1
(integer) 1
127.0.0.1:6379> del session:N
(integer) 0
Ответ Redis идентичен команде exists
:
Допустим, в сессии нужно хранить не только идентификатор (user_id), но и электронную почту пользователя (email). Для этого достаточно в значение положить JSON-объект, содержащий всю необходимую информацию:
127.0.0.1:6379> set session:1 '{"user_id":120,"email":"test@test.com"}'
OK
127.0.0.1:6379> get session:1
"{\"user_id\":120,\"email\":\"test@test.com\"}"
Этот метод имеет некоторые недостатки:
127.0.0.1:6379> JSON.GET session1 .user_id
set
, get
, del
, exists
.Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт