Сохраняет ли Redis данные?

122

Я понимаю, что Redis обслуживает все данные из памяти, но сохраняется ли это также при перезагрузке сервера, чтобы при перезагрузке сервера он считывал в память все данные с диска. Или это всегда пустое хранилище, предназначенное только для хранения данных, пока приложения работают без сохранения?

Zuriar
источник
1
Я не уверен, правильно ли я понял ваш вопрос. Вы можете сохранить снимок на диск и читать из этого файла, если вы этого не сделаете, ваша база данных Redis будет пустой при перезагрузке.
Sefa

Ответы:

82

Предлагаю вам прочитать об этом на http://redis.io/topics/persistence . По сути, вы теряете гарантированное постоянство, когда увеличиваете производительность, используя только хранение в памяти. Представьте сценарий, в котором вы ВСТАВЛЯЕТЕ в память, но прежде, чем она сохранится на диске, теряет мощность. Будет потеря данных.

Redis поддерживает так называемые «снимки». Это означает, что он будет делать полную копию того, что находится в памяти в определенные моменты времени (например, каждый полный час). Когда вы теряете питание между двумя снимками, вы теряете данные за время между последним снимком и падением (не обязательно отключение электроэнергии ..). Redis торгует безопасностью данных и производительностью, как и большинство NoSQL-DB.

Большинство баз данных NoSQL придерживаются концепции репликации между несколькими узлами, чтобы минимизировать этот риск. Redis считается скорее быстрым кешем, чем базой данных, которая гарантирует согласованность данных. Поэтому его варианты использования обычно отличаются от реальных баз данных: вы можете, например, хранить сеансы, счетчики производительности или что-то еще с непревзойденной производительностью и без реальных потерь в случае сбоя. Но обработка заказов / истории покупок и т. Д. Считается делом для традиционных баз данных.

Мануэль Арвед Шмидт
источник
1
Было бы здорово, если бы вы могли добавить поведение сохраняемости по умолчанию. Нравится ответ @Leonid Beschastny.
yeya 08
40

Сервер Redis время от времени сохраняет все свои данные на жесткий диск, обеспечивая таким образом определенный уровень устойчивости.

Он сохраняет данные в одном из следующих случаев:

  • автоматически время от времени
  • когда вы вручную вызываете BGSAVEкоманду
  • когда Redis закрывается

Но данные в Redis не являются постоянными, потому что:

  • сбой процесса redis означает потерю всех изменений с момента последнего сохранения
  • BGSAVE операция может быть выполнена только в том случае, если у вас достаточно свободной оперативной памяти (объем дополнительной оперативной памяти равен размеру Redis DB)

NB: BGSAVE потребность в ОЗУ является реальной проблемой, потому что redis продолжает работать до тех пор, пока не останется ОЗУ для запуска, но он прекращает сохранять данные на жесткий диск намного раньше (примерно при 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 записывает обновление в файл журнала только для apappend, аналогичный MySql.

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

songxin
источник