Как работает Redis. Особенности кэширования

Redis — одна из самых популярных NoSQL баз данных. Рассказываем о функциональности и практиках использования.

Особенности Redis

Почему Redis стал таким популярным и продолжает активно развиваться?

  • Redis очень быстрый. Он обеспечивает моментальный доступ к данным, поскольку хранит их в оперативной памяти (in-memory).
  • Redis легко масштабируется горизонтально (до 1000 нод на практике).
  • Кластеры Redis поддерживают master-slave репликацию и могут быть отказоустойчивыми. При потере связи с мастер-нодой, кластер автоматически повышает одну из ее реплик до мастера, а вышедшую из строя ноду пересоздает.
  • Большое комьюнити и обилие документации.
  • Redis проще в обслуживании, чем аналоги вроде Memcached или Tarantool + почти не уступает им в функциональности, а где-то даже опережает.

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

В отличие от других популярных in-memory БД, например, Memcached, Redis умеет работать с хранением структурированных данных. 

Redis поддерживает пять типов данных и пару надстроек. Каждый тип данных охватывает различные операции.

  • String — любые значения до 512 Мб.
  • Hash — хэш-таблицы для хранения объектов.
  • List — список строковых значений.
  • Set — не повторяющийся список строковых значений.
  • Sorted set — отсортированный set.
  • Bitmap — набор битовых операций поверх string.
  • Hyper loglog — вероятностная структура данных для подсчета количества уникальных элементов в множестве (cardinality, мощность множества) без сохранения самих данных.

Кроме этого, Redis может периодически записывать данные на диск. Полную защиту от потери данных решение не гарантирует, но все равно эта опция добавляет надежности. Подробнее о том, что такое Redis и кому подойдет эта БД, читайте в этом материале.

Redis относится к однопоточным БД. Команды не обрабатываются параллельно, а только в определенной последовательности, поэтому с его помощью часто выстраивают систему очередей.

В таком случае Redis становится промежуточным звеном между веб-сервером (producer) и программой (consumer). Например, используя тип данных list, можно разгрузить сервер и записывать данные в очередь, из которой их позже будет забирать consumer. Благодаря командам LPUSH и RPUSH в Redis также реализована функциональность, что новые значения можно записывать в начало или конец очереди.

О том, как работают очереди в Redis мы расскажем в одном из следующих материалов.

Как работает кэширование в Redis

Чаще всего Redis используют как вспомогательную базу данных (или кэш-сервер), которая работает в паре с объектно-реляционными системами управления БД, например, PostgreSQL. Парное использование БД решает проблему быстрой загрузки мелких часто обновляемых объектов и защищает от потерь важных данных.

Кэш – это как посредник между хранилищем и данными, которые запрашивает клиент. Если настроить/использовать кэш правильно, это снижает нагрузку на сервера БД. 

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

Эффект хорошо виден в высоконагруженных системах, когда группы данных запрашиваются действительно часто. При нагрузке в 100 пользователей/час, особой пользы от кэширования не будет.

Помимо того, что Redis является кэш-сервером, он также является сервером структур данных. 

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

Имплементация Redis

Для работы с Python 3 сначала нужно установить Redis-библиотеку, а далее  подключаться через Import.

Примера того, как должно выглядеть соединение:

Import redis
Import sqlite3

def get_my_friends():

connection = sqlite3.connect(database="database.db") 
cursor = connection.cursor()

redis_client = redis.Redis()
# в промежуточной строчке мы спрашиваем у Redis наличие ключа.

cache_value = redis_client.get("user")
# здесь прописывается уникальный ключ для базы данных, например, id пользователя. 

if cache_value is not None:
	return json.loads(cache_value)

cursor.execute("Select id, name FROM users;")
result = cursor.fetchall()
redis_client.set("user", json.dumps(result))


cursor.close()
redis_client.close()
return result

В боевых проектах эту конструкцию нужно как минимум обернуть в try except.

Заключение

Использование Redis в проектах помогает разгрузить основную базу данных и управлять ресурсами сервера более эффективно. Имплементация Redis помогает высоконагруженным системам предоставлять высокий уровень сервиса всем клиентам.

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

Что еще почитать по теме

Разделяй и властвуй: как развивалась сеть Selectel

Рассказываем, с какими проблемами мы столкнулись во время открытия новых дата-центров и как пришли к современным схемам резервирования. 

Чем аттестованный сегмент ЦОД отличается от классического?

В статье рассказываем, чем отличается аттестованный сегмент от обычного и как организована работа с серверами А-ЦОД в Selectel.
Дарья Маташина 22 ноября 2022

Как пережить «Черную пятницу»‎ без потерь?

Чек-лист для подготовки IT-инфраструктуры и специальные предложения от Selectel.
Дарья Маташина 22 ноября 2022

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Андрей Салита 26 января 2023

Что такое общедоступные персональные данные и что к ним относится

Разбираемся, что относится к общедоступным персональным данным и как они защищаются законом.
Андрей Салита 26 января 2023

Глобальный роутер Selectel: преимущества и сценарии использования

Рассказываем о решении, которое позволит организовать гибридную инфраструктуру на базе серверов — выделенных и облачных — в разных пулах и регионах.
Михаил Фомин 24 января 2023

Не все типы репликации одинаково полезны, или почему две MySQL лучше одной

В это сложно поверить, но MySQL как продукт появился еще в 1995 году. Со временем название СУБД стало таким же нарицательным, как Xerox. Сегодня под этим термином могут понимать самые разные связки: о…
Михаил Фомин 24 января 2023