Ответ 1
Нет, Redis намного больше, чем кеш.
Как и кеш, Redis сохраняет пары ключ = значение. Но в отличие от кеша, Redis позволяет вам управлять значениями. Существует 5 типов данных в Redis - Strings, Sets, Hash, Lists и Sorted Sets. Каждый тип данных предоставляет различные операции.
Лучший способ понять Redis - это модель приложения, не задумываясь о том, как вы собираетесь хранить его в базе данных.
Предположим, мы хотим построить StackOverflow.com. Чтобы это было просто, нам нужны вопросы, ответы, теги и пользователи.
Вопросы моделирования, пользователи и ответы
Каждый объект может быть смоделирован как карта. Например, вопрос представляет собой карту с полями {id, title, date_asked, votes, ask_by, status}. Аналогично, ответ - это карта с полями {id, question_id, answer_text, answer_by, vote, 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 есть модель pub-sub. Вы можете создавать каналы, например "channel_questions_tagged_redis". Вы затем subscribe
пользователей на определенный канал. Когда будет добавлен новый вопрос, вы отправите publish
сообщение на этот канал. Затем все пользователи получат сообщение. Вам нужно будет использовать веб-технологии, такие как веб-сокеты или кометы, чтобы фактически доставить сообщение в браузер, но Redis помогает вам со всей сантехникой на стороне сервера.
Стойкость, надежность и т.д.
В отличие от кэша, Redis сохраняет данные на жестком диске. У вас может быть настройка ведущий-ведомый, чтобы обеспечить лучшую надежность. Чтобы узнать больше, перейдите по темам Persistence and Replication здесь - http://redis.io/documentation