Нет, 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