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

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

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

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

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

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

  1. String — любые значения до 512 Мб.
  2. Hash — хэш-таблицы для хранения объектов.
  3. List — список строковых значений.
  4. Set — не повторяющийся список строковых значений.
  5. 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.

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

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

Комментарии (7)


  1. suslovas
    22.08.2022 13:44
    +2

    Откуда берется значение переменной cache_key в примере? Не очень понятно.


    1. Veritaris
      24.08.2022 18:09

      Подозреваю что на самом деле там должно быть cache_value


  1. rozhnev
    22.08.2022 15:47
    +21

    Поверхностная банальная писанина для PR


    1. Rampages
      23.08.2022 02:10

      Ну да, статья от копирайтера, а не от тех. специалиста... <sarcasm>Хабр уже не торт.</sarcasm>


  1. Revertis
    22.08.2022 16:16
    +9

    def get_my_friends():

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

    cursor = connection.cursor()

    redis_client = redis.Redis()

    Зачем дёргать sqlite до того, как проверено наличие ключа в Редисе?


  1. GospodinKolhoznik
    22.08.2022 23:02
    +1

    Я успел заметить, что вначале в заголовке была опечатка "За что мы любимы Redis". И чёрт бы с ней, но получилось даже прикольно, типа - Почему Redis так хорош? - Потому что он нас любит ;)


  1. webdevium
    23.08.2022 12:54

    Важно не забывать о существовании KeyDB