Как работает 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, чтобы не тратить время на самостоятельный поиск решений, настройку баз данных и создание бэкапов.

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

Кирилл Филипенко 14 сентября 2022

Увеличиваем FPS в аниме с помощью нейросети и GPU Tesla T4

Рассказываем про технологию интерполяции и ее практическое применение с помощью облачных серверов с GPU.
Кирилл Филипенко 14 сентября 2022
Ульяна Малышева 25 августа 2022

CDN против DDoS-атак: в каких случаях это действительно работает

Рассказываем про неочевидное преимущество CDN — услуга повышает безопасность инфраструктуры за счет защиты от DDoS-атак.
Ульяна Малышева 25 августа 2022
T-Rex 24 августа 2022

IT-инфраструктура организации: понятие, типы и функции

Рассказываем об IT-инфраструктуре предприятия и ее компонентах для малого, среднего и крупного бизнеса.
T-Rex 24 августа 2022

Новое в блоге

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

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

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

Гипервизор VMware ESXi: функции и отличия от ESX

В статье рассказываем о работе с гипервизором ESXi, его отличиях от ESX и vSphere.
T-Rex 21 сентября 2022

Делегирование от «А» до «Я»: инструкция для начинающих руководителей

Рассказываем про барьеры в делегировании, помогаем избежать «эффекта надзора» и делимся опытом тимлидов Selectel.