Чи Redis - це лише кеш?


255

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

Ви ефективно просто додаєте об'єкти до сховища даних в пам'яті за допомогою унікального ключа. Здається, немає жодної реляційної семантики ...

Що я пропускаю?


3
Від redis.io : Redis - це відкритий джерело, розширений магазин ключових значень. Його часто називають сервером структури даних, оскільки ключі можуть містити рядки, хеші, списки, набори та сортовані набори. При цьому я проголосував за закриття вашого питання, оскільки воно не відповідає формату StackOverflow.
Лінус Тіль

29
Я погоджуюся, що це не так формат. Де ви вважаєте, де це було б доречніше?
Метт Еванс

Відповіді:


631

Ні, 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


15
Це також надзвичайно проста службова шина, що використовує команди PUB / SUB, пов'язані.
Джим Денніс

3
Як я можу отримати запитання користувача? Чи потрібно створити список для кожного користувача з вашими запитаннями, як-от запитання: user: 1 чи я повинен використовувати теги?
Діого Алвеш

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

5

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

  • У пам'яті зберігання ключа-значення
  • Підтримка декількох типів даних (рядки, хеші, списки, набори, відсортовані набори, растрові карти та гіперлоги)
  • Він надає можливість зберігати дані кешу у фізичному сховищі (за потреби).
  • Підтримка моделі pub-sub
  • Кеш Redis забезпечує реплікацію для високої доступності (master / slave)

4

Redis має унікальні здібності, як ультрашвидкісні луа-скрипти. Час його виконання дорівнює виконанню команд C. Це також приносить атомність для складних маніпуляцій з Redis, необхідних для роботи багатьох вдосконалених об'єктів, таких як Замки та Семафори.

Існує 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.

реалізація з python

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.