Чи зберігаються дані Redis?


122

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


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

Відповіді:


82

Пропоную прочитати про це на http://redis.io/topics/persistence . В основному ви втрачаєте гарантовану стійкість при підвищенні продуктивності, використовуючи лише зберігання в пам'яті. Уявіть собі сценарій, коли ви ВСТАВИТИ в пам'ять, але до того, як він збережеться, диск втратить силу. Буде втрата даних.

Redis підтримує так звані "знімки". Це означає, що вона зробить повну копію того, що відбувається в пам'яті в певні моменти часу (наприклад, кожну повну годину). Коли ви втратите живлення між двома знімками, ви втратите дані за час між останнім знімком і збоєм (не повинно бути відключенням електроенергії ..). Redis торгує безпекою даних у порівнянні з продуктивністю, як це робить більшість NoSQL-БД.

Більшість баз даних NoSQL дотримуються концепції реплікації між декількома вузлами, щоб мінімізувати цей ризик. Redis вважається більш швидким кешем замість бази даних, що гарантує узгодженість даних. Тому випадки його використання, як правило, відрізняються від реальних баз даних: Ви можете, наприклад, зберігати сеанси, лічильники продуктивності чи будь-що інше в ньому з неперевершеною продуктивністю і без реальних втрат у разі аварії. Але обробка замовлень / історії закупівлі тощо - вважається роботою для традиційних баз даних.


1
Буде чудово, якщо ви зможете додати постійну поведінку за замовчуванням. Як і @Leonid Beschastny відповідь.
yeya

40

Сервер Redis час від часу зберігає всі свої дані на жорсткому диску, забезпечуючи тим самим певний рівень стійкості.

Він зберігає дані в одному з таких випадків:

  • час від часу автоматично
  • коли ви вручну викликаєте BGSAVEкоманду
  • коли Redis вимикається

Але дані в Redis насправді не є стійкими, оскільки:

  • крах процесу Redis означає втрату всіх змін з моменту останнього збереження
  • BGSAVE операція може бути виконана, лише якщо у вас достатньо вільної оперативної пам’яті (кількість додаткової оперативної пам’яті дорівнює розміру redis DB)

Примітка: BGSAVE вимога оперативної пам’яті є справжньою проблемою, оскільки редис продовжує працювати, поки не буде більше оперативної пам’яті, але він зупиняє збереження даних на жорсткому диску набагато раніше (приблизно 50% ОЗУ).

Для отримання додаткової інформації див. Redis Persistence .


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

15

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

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

Якщо ви хочете "SQL як наполегливість", вони сказали:

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


7

Відповідь, як правило, так , проте більш повна відповідь дійсно залежить від того, який тип даних ви намагаєтесь зберігати. Загалом, більш повна коротка відповідь:

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

Сказавши це, за замовчуванням Redis збереже знімки даних з періодичним інтервалом (мабуть, це кожні 1 хвилини, але я цього не перевіряв - це описано у статті нижче, що є гарним базовим введенням):

http://qnimate.com/redis-permanent-storage/


TL; DR

З офіційних документів :

  • Постійність RDB [за замовчуванням] виконує точні моменти зйомки вашого набору даних через визначені інтервали.
  • Постійність AOF [потрібно чітко налаштувати] записує в журнал кожну операцію запису, отриману сервером, яка буде знову відтворюватися при запуску сервера, реконструюючи початковий набір даних.

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


5

Ви можете взагалі не мати стійкості. Кращі показники, але всі дані втрачаються, коли Redis вимикається.

Redis має два механізми збереження: RDB і AOF.RDB використовує глобальний знімок знімків планувальників, і AOF записує оновлення в файл журналу, призначений лише для додатків, схожий на MySql.

Ви можете використовувати один з них або обидва. Коли Redis перезавантажується, він створює дані з читання RDB-файлів або AOF-файлів.

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