В чому сенс декількох баз даних Redis?


159

Отже, я прийшов до місця, де мені хотілося сегментувати дані, які я зберігаю в Redis, на окремі бази даних, оскільки мені іноді потрібно використовувати команду ключів на одному конкретному виді даних, і хотів розділити їх, щоб зробити це швидше .

Якщо я сегментую на декілька баз даних, все ще залишається однопоточним, і я все ще можу використовувати лише одне ядро. Якщо я лише запускаю інший екземпляр Redis в тому ж полі, я можу використовувати додаткове ядро. Крім того, я не можу назвати бази даних Redis або давати їм будь-який більш логічний ідентифікатор. Отже, маючи все сказане, чому / коли я коли-небудь хочу використовувати декілька баз даних Redis, а не просто розкручувати додатковий екземпляр Redis для кожної додаткової бази даних, яку я хочу? І, відповідно, чому Redis не намагається використовувати додаткове ядро ​​для кожної додаткової бази даних, яку я додаю? Яка перевага бути однопоточним в базі даних?


у вашому додатку Node.js зробіть це ---> module.exports = {"1": "ваше ім'я для redis db one", "2": "ваше ім'я для redis db two", "3": "ваше ім'я для redis db три "} тощо, або переключіть ключі та значення, що вам потрібно
Alexander Mills

1
У Redis 2.8.0 і новіших версіях рекомендується використовувати SCAN замість KEYS, оскільки він повторює невелику кількість елементів одночасно (тим самим не блокуючи сервер протягом тривалого періоду часу).
TryHarder

Відповіді:


85

В основному, бази даних Redis в одному і тому ж екземплярі не відрізняються від схем екземплярів бази даних RDBMS.

Отже, маючи все сказане, чому / коли я коли-небудь хочу використовувати декілька баз даних Redis, а не просто розкручувати додатковий екземпляр Redis для кожної додаткової бази даних, яку я хочу?

Є одна очевидна перевага використання баз даних redis в тому самому екземплярі redis, і це управління. Якщо ви створили окремий екземпляр для кожної програми, і скажімо, у вас є 3 додатки, це 3 окремі екземпляри Redis, кожен з яких, ймовірно, потребує раб для HA у виробництві, так що це 6 загальних примірників. З точки зору управління, це стає безладним дуже швидко, оскільки вам потрібно стежити за всіма ними, робити оновлення / виправлення тощо. Якщо ви не плануєте перевантажувати Redis з високим входом / виводом, один екземпляр з веденим простішим і простіше в управлінні за умови, що він відповідає вашій умові угоди.


25
Кілька випадків Redis - це завжди шлях. Період. Запускайте паралельні запити для різних даних. Якщо ваш конвеєр CICD не створює для вас кеш-кластери, виправте це, а не ..... Ви отримаєте точку
Cmag

3
Це не стосується пунктів OP: (1) чому Redis не намагається використовувати додаткове ядро ​​для кожної додаткової бази даних? (2) Яка перевага бути однопоточним в базі даних?
Ives

93

Ви не хочете використовувати кілька баз даних в одному екземплярі redis. Вона застаріла, і, як ви зазначали, кілька примірників дозволяють вам скористатися декількома ядрами. Якщо ви користуєтесь вибором бази даних, вам доведеться зробити рефактор під час оновлення. Моніторинг та управління кількома прикладами не є важким і не болючим.

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

Як сказав Джонатон, не використовуйте команду ключів. Набагато кращі показники ви знайдете, якщо просто створити ключовий індекс. Щоразу, коли ви додаєте ключ, додайте ім'я ключа до набору. Команда ключів не дуже корисна, коли ви збільшуєте масштаб, оскільки для повернення знадобиться значний час.

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

Щодо одинарної різьби, врахуйте, що redis призначений для швидкості та атомності. Впевнені дії, що змінюють дані в одному db, не потрібно чекати на іншому db, але що робити, якщо ця дія зберігається у дамп-файлі чи обробці транзакцій на рабах? З цього моменту ви починаєте потрапляти в бур’яни програмування паралельності.

Використовуючи кілька екземплярів, ви перетворюєте складність багатопотокової передачі на простішу систему стилю передачі повідомлень.


57
Використання кількох баз даних застаріло? Чи можете ви надати посилання на цю заяву, будь ласка. Мені відомо, що в Redis Cluster не підтримуються декілька баз даних, але також немає складних команд з декількома ключами, і вони не застаріли.
ostergaard

27
Деякі (вагомі) докази власника Redis (згідно з кодом Google) про те, що "... бази даних не будуть застарілими, навіть якщо я в минулому заявив, що вони будуть".
Кенні Евітт

3
Ви не зможете використовувати більше, ніж один redis db на redis-кластері. Крім цього, багато баз даних все ще залишаться річчю.
coredump

26
-1 для застарілого твердження. Кілька баз даних можуть перешкоджати та не підтримуватись у кластері redis, але вони не застаріли.
AgDude

1
@ the-real-bill Як можна "створити ключовий індекс"?
Kees de Kooter

57

Навіть Сальваторе Санфіліппо (творець Redis) вважає поганою ідеєю використовувати декілька БД в Redis. Дивіться його коментар тут:

https://groups.google.com/d/topic/redis-db/vS5wX8X4Cjg/discussion

Я розумію, як це може бути корисним, але, на жаль, я вважаю, що помилки в базі даних Redis є моїм найгіршим рішенням у дизайні Redis взагалі ... без будь-якого реального посилення, це робить внутрішні органи набагато складнішими. Реальність полягає в тому, що бази даних не змінюються масштабно з кількох причин, як-от активний термін дії ключів і VM. Якщо вибір БД можна виконати за допомогою рядка, я можу бачити, що ця функція використовується як масштабований словник O (1) словника, що замість цього не є.

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


4
Тримайтеся, тому використання вибору БД насправді менш ефективне, ніж просто використання префікса? Це те, що означає це речення тут (міг би хтось просити уточнити)? "Якщо виділення БД можна виконати за допомогою рядка, я бачу, що ця функція використовується як масштабований словник O (1) словника, що замість цього не є."
двтан

8
  1. Я не знаю жодних переваг від наявності декількох баз даних в одному екземплярі. Я думаю, що це корисно, якщо кілька сервісів використовують один і той же сервер бази даних, тому ви можете уникнути зіткнення ключів.

  2. Я б не рекомендував будувати навколо використання KEYSкоманди, оскільки це O (n), і це не так добре. Що ви використовуєте для цього, що можете досягти іншим способом? Можливо, redis - це не найкращий варіант для вас, якщо KEYSжиттєво важлива функціональність.

  3. Я думаю, що вони згадують про переваги одного потокового сервера у своїх FAQ, але головне - простота - вам не потрібно зациклюватися на одночасності. Кожна дія блокується, тому жодна дві речі не можуть одночасно змінювати базу даних. В ідеалі у вас є один (або більше) екземплярів на ядро ​​кожного сервера, а для розподілу ключів між ними використовуйте послідовний алгоритм хешування (або проксі). Звичайно, ви втратите деяку функціональність - трубопроводи працюватимуть лише для речей на одному сервері, сортування стає складніше тощо.


У відповідь на 2: Я використовую команду ключів лише тоді, коли мені потрібні всі клавіші. Я використовую його так само, як і hgetall. Обидва є O (n). Клавіші погані, якщо вам потрібно пошукати величезний набір клавіш для деякого регулярного виразу, але це цілком добре, якщо вам потрібно виконати деяку операцію з усіма клавішами в якомусь db. У відповідь на 3: Я розумію переваги однократного введення в одну базу даних. Я не розумію цього в багатьох базах даних, оскільки дії на одній базі даних ніколи не повинні блокувати дії на іншій базі даних AFAIK.
Елі

3

Я використовую redis для реалізації чорного списку адрес електронної пошти, і у мене є різні значення TTL для різних рівнів чорного списку, тому наявність різних БД в одному екземплярі мені дуже допомагає.


1
Зараз ми стикаємося з одним і тим же питанням - ми хочемо визначити різні політики LRU для різних частин наших даних. Ви можете поділитися, як ви це реалізували?
користувач2717436

@ user2717436 Я не впевнений, що те, що я роблю, пов'язане з вашим, але я використовую різні бази даних як різні набори, завжди встановлюючи TTL клавіш, коли я вставляю їх. як на чорному списку A на redis.get (1), і кожного разу, коли я встановлюю ключ, я встановлюю термін дії до 5000. і на redis.get (2) є чорний список B, і коли я встановлюю ключ, термін дії закінчується на 10000
kommradHomer

2

Бази даних Redis можуть використовуватися в рідкісних випадках розгортання нової версії програми, де нова версія вимагає роботи з різними об'єктами.


1

Використання декількох баз даних в одному екземплярі може бути корисним у наступному сценарії:

Різні копії однієї бази даних можуть бути використані для виробництва, розробки або тестування з використанням даних у режимі реального часу. Люди можуть використовувати репліку для клонування екземпляра Redis для досягнення тієї ж мети. Однак попередній підхід для існуючих запущених програм простіше просто вибрати потрібну базу даних, щоб перейти в призначений режим.


1

Я знаю, що це питання вже років, але є ще одна причина, за якою можуть бути корисні кілька баз даних.

Якщо ви використовуєте "хмару Redis" від улюбленого постачальника послуг хмари, ви, мабуть, маєте мінімальний об'єм пам'яті і будете платити за виділене вами. Якщо ж ваш набір даних менший, ніж ви, то ви витратите трохи виділення і таким чином витратите трохи грошей.

Використовуючи бази даних, ви можете використовувати той самий хмарний екземпляр Redis для надання послуг (скажімо) розробників, UAT та виробництва, або декількох примірників вашої програми, або що-небудь ще - таким чином, використовуючи більше виділеної пам’яті і, таким чином, трохи більше витрат, ефективний.

У випадку використання, на який я переглядаю, є кілька прикладів програми, яка використовує 200-300K кожен, але мінімальний розмір мого хмарного провайдера - 1М. Ми можемо об'єднати 10 примірників на одному Redis, не створюючи зубців в будь-яких межах, і таким чином заощадити близько 90% вартості хостингу Redis. Я вдячний, що існують обмеження та проблеми щодо цього підходу, але я вважав, що це варто згадати.

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