Ні, Redis - це набагато більше, ніж кеш.
Як і кеш, Redis зберігає пари key = value. Але на відміну від кеша, Redis дозволяє оперувати значеннями. У Redis є 5 типів даних - рядки, набори, хеш, списки та сортовані набори. Кожен тип даних піддається різним операціям.
Найкращий спосіб зрозуміти Redis - це моделювати додаток, не замислюючись про те, як ви збираєтеся зберігати його в базі даних.
Скажімо, ми хочемо створити StackOverflow.com. Щоб зробити це просто, нам потрібні запитання, відповіді, теги та користувачі.
Моделювання питань, користувачів та відповідей
Кожен об’єкт може бути змодельований як карта. Наприклад, запитання - це карта з полями {id, title, date_asked, голосів, ask_by, status}. Аналогічно відповідь - це карта з полями {id, question_id, answer_text, answer_by, голоси, статус}. Аналогічно ми можемо моделювати об’єкт користувача.
Кожен з цих об'єктів може бути безпосередньо збережений у 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 за допомогою конвеєрного перегляду та покажіть їх користувачеві.
Запитання за тегами, відсортовано за голосами
Далі ми хочемо отримати запитання щодо кожного тегу. Але ТАК дозволяє бачити найвищі запитання, нові запитання або без відповіді під кожним тегом.
Щоб моделювати це, ми використовуємо функцію сортування набору 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