Redis - это просто кеш?


255

Я читал некоторые документы Redis и пробовал учебник по адресу http://try.redis-db.com/ . Пока что я не вижу никакой разницы между Redis и технологиями кэширования, такими как Velocity или Enterprise Library Caching Framework.

Вы фактически просто добавляете объекты в хранилище данных в памяти, используя уникальный ключ. Кажется, нет никакой реляционной семантики ...

Чего мне не хватает?


3
Из redis.io : Redis - это расширенное хранилище значений ключей с открытым исходным кодом. Его часто называют сервером структуры данных, поскольку ключи могут содержать строки, хэши, списки, наборы и отсортированные наборы. Тем не менее, я проголосовал за закрытие вашего вопроса, так как он не соответствует формату StackOverflow.
Линус Тиль

29
Я согласен, это не ТАКОЙ формат. Как вы думаете, где это будет более уместно?
Мэтт Эванс

Ответы:


631

Нет, Redis - это больше, чем кеш.

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

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

Допустим, мы хотим построить StackOverflow.com. Для простоты нам нужны Вопросы, Ответы, Теги и Пользователи.

Вопросы моделирования, пользователи и ответы

Каждый объект может быть смоделирован как карта. Например, вопрос - это карта с полями {id, title, date_asked, Голосование, ask_by, статус}. Аналогично, ответ - это карта с полями {id, question_id, answer_text, answer_by, voice, status}. Точно так же мы можем моделировать пользовательский объект.

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

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Обработка голосов

Теперь, каждый раз, когда кто-то поднимает вопрос или ответ, вам просто нужно сделать это

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Список вопросов для домашней страницы

Далее мы хотим сохранить самые последние вопросы для отображения на главной странице. Если бы вы писали программу на .NET или Java, вы бы сохраняли вопросы в списке. Оказывается, это лучший способ хранить это и в Redis.

Каждый раз, когда кто-то задает вопрос, мы добавляем его идентификатор в список.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Теперь, когда вы хотите отобразить свою домашнюю страницу, вы задаете Redis последние 25 вопросов.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

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

Вопросы по тэгам, отсортированные по голосам

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

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

Давайте сделаем это для тега Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

Что мы здесь сделали? Мы добавили вопросы в отсортированный набор и привязали оценку (количество голосов) к каждому вопросу. Каждый раз, когда вопрос ставится на голосование, мы будем увеличивать его оценку. И когда пользователь нажимает кнопку «Вопросы с меткой Redis, отсортированные по голосам», мы просто делаем zrevrangeответ и возвращаем главные вопросы.

Вопросы в реальном времени без обновления страницы

И, наконец, бонусная функция. Если вы оставите страницу с вопросами открытой, SO уведомит вас, когда будет добавлен новый вопрос. Как Redis может помочь здесь?

Redis имеет модель паб-саб. Вы можете создавать каналы, например "channel_questions_tagged_redis". Затем вы subscribeпользователи определенного канала. Когда добавляется новый вопрос, вы отправляете publishсообщение на этот канал. Все пользователи получат сообщение. Вам придется использовать веб-технологию, такую ​​как веб-сокеты или кометы, для фактической доставки сообщения в браузер, но Redis поможет вам со всеми системами на стороне сервера.

Настойчивость, надежность и т. Д.

В отличие от кэша, Redis сохраняет данные на жестком диске. Вы можете настроить главный-подчиненный для обеспечения большей надежности. Чтобы узнать больше, просмотрите темы Постоянства и Репликации здесь - http://redis.io/documentation


15
Это также чрезвычайно простая служебная шина, использующая команды, связанные с PUB / SUB.
Джим Деннис

3
Как я могу получить вопрос от пользователя? Должен ли я создать список для каждого пользователя с вашими вопросами, например вопросы: user: 1 или я должен использовать теги?
Диого Алвес

2
очень полезное и подробное объяснение, которое я каждый видел на SO
Trong Vu

5

Не просто кеш.

  • В памяти ключ-хранилище
  • Поддержка нескольких типов данных (строки, хэши, списки, наборы, отсортированные наборы, растровые изображения и гиперлоглоги)
  • Он предоставляет возможность хранить данные кэша в физическом хранилище (при необходимости).
  • Поддержка паб-под модель
  • Кэш Redis обеспечивает репликацию для высокой доступности (ведущий / ведомый)

4

Redis обладает уникальными способностями, такими как сверхбыстрые lua-скрипты. Время его выполнения равняется выполнению Си-команд. Это также обеспечивает атомарность для сложных манипуляций с данными Redis, необходимых для работы многих сложных объектов, таких как Locks и Semaphores.

Существует Redis, основанный на сетке данных памяти под названием Redisson, которая позволяет легко создавать распределенные приложения на Java . Благодаря распределенным Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapобъекты и многим другим.

Прекрасно работает в облаке и поддерживает AWS Elasticache , AWS Elasticache Cluster и Azure Redis кэша поддержки


1

На самом деле нет никакой зависимости между относительным представлением данных (или любым типом представления данных) и ролью базы данных (кеш, постоянное постоянство и т. Д.).

Redis хорош для кеша, но это гораздо больше, чем просто кеш. Это высокоскоростная база данных в оперативной памяти. Сохраняет данные на диске. Это не реляционное, это хранилище ключей и значений.

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


0

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

Он быстрый, надежный, обеспечивает атомарность и согласованность и имеет ряд типов данных, таких как наборы, хэши, списки и т. Д.

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


0

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

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


0

Redis поддерживает структуры данных, такие как строки, хэши, списки, наборы, отсортированные наборы с запросами диапазона, растровые изображения, гиперлогоги, геопространственные индексы с запросами радиуса и потоками. Redis имеет встроенную репликацию, сценарии Lua, исключение LRU, транзакции и различные уровни сохранения на диске, а также обеспечивает высокую доступность через Redis Sentinel и автоматическое разбиение с помощью Redis Cluster.

реализация с питоном

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.