← Назад к вопросам

Как происходит запись на диск в Redis?

2.0 Middle🔥 141 комментариев
#DevOps и инфраструктура#Базы данных (NoSQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Механизмы сохранения на диск в Redis

Redis предоставляет два основных механизма для персистентности данных на диск:

1. RDB (Redis Database Snapshot)

RDB — это снимок состояния всей базы данных в конкретный момент времени. Это бинарный формат, который содержит полный слепок памяти Redis.

Как это работает:

  • Redis использует команду BGSAVE для создания снимка в фоновом процессе
  • Основной процесс Redis создаёт дочерний процесс (fork), который пишет данные в файл
  • Дочерний процесс не блокирует основной, он может продолжать обслуживать команды
  • По умолчанию сохраняется в файл dump.rdb

Конфигурация RDB в redis.conf:

save 900 1       # Сохранить если 1 ключ изменился за 900 сек (15 мин)
save 300 10      # Сохранить если 10 ключей за 300 сек (5 мин)
save 60 10000    # Сохранить если 10000 ключей за 60 сек

Преимущества RDB:

  • Быстрое восстановление при запуске
  • Компактный файл (сжатый формат)
  • Хорош для бэкапов

Недостатки:

  • Может потерять данные между снимками
  • Fork дорогой для больших датасетов
  • Использует много памяти во время fork

2. AOF (Append Only File)

AOF — лог всех операций записи, которые были выполнены на Redis. Это текстовый формат, который можно прочитать.

Как это работает:

  • Каждая команда записи (SET, DEL, LPUSH и т.д.) логируется в файл appendonly.aof
  • При запуске Redis переиграет все команды из этого файла
  • Гарантирует, что теряются только последние команды перед крахом

Конфигурация AOF:

appendonly yes
appendfsync everysec    # fsync каждую секунду (баланс безопасности и производительности)

Варианты appendfsync:

  • always — fsync после каждой команды (самый безопасный, самый медленный)
  • everysec — fsync раз в секунду (по умолчанию, рекомендуется)
  • no — не fsync, ОС сама решает (быстро, но может потерять много данных)

Преимущества AOF:

  • Минимальная потеря данных
  • Логируются все операции, легко отследить

Недостатки:

  • Файл больше чем RDB
  • Медленнее восстановление
  • Требует периодической переписи (rewrite)

3. Гибридный подход

В Redis 4.0+ можно использовать оба механизма одновременно:

# Пример с redis-py
import redis

r = redis.Redis(host="localhost", port=6379)

# Инициировать BGSAVE
r.bgsave()

# Инициировать BGREWRITEAOF
r.bgrewriteaof()

RDB + AOF гибридный режим (Redis 6.2+):

aof-use-rdb-preamble yes  # RDB часть + AOF для новых команд

Первый снимок сохраняется как RDB (быстро), затем новые команды пишутся в AOF. При восстановлении сначала загружается RDB, потом проигрываются команды из AOF.

Практический пример

import redis
from datetime import datetime

class RedisManager:
    def __init__(self):
        self.r = redis.Redis(host="localhost", port=6379, decode_responses=True)
    
    def backup_snapshot(self):
        """Создать снимок RDB в фоне"""
        info = self.r.bgsave()
        print(f"RDB backup started: {info}")
    
    def rewrite_aof(self):
        """Переписать AOF лог, удалив дублирующиеся команды"""
        self.r.bgrewriteaof()
        print("AOF rewrite started")
    
    def get_persistence_info(self):
        """Получить информацию о персистентности"""
        info = self.r.info("persistence")
        return {
            "rdb_last_save_time": datetime.fromtimestamp(info["rdb_last_save_time"]),
            "rdb_changes_since_last_save": info["rdb_changes_since_last_save"],
            "aof_enabled": info["aof_enabled"],
            "aof_rewrite_in_progress": info["aof_rewrite_in_progress"]
        }

# Использование
manager = RedisManager()
manager.backup_snapshot()
manager.rewrite_aof()
print(manager.get_persistence_info())

Когда использовать

  • RDB: Когда нужна максимальная производительность, потеря последних секунд данных приемлема
  • AOF: Когда нужна высокая безопасность данных
  • RDB + AOF: Для production окружения с обоими требованиями

В production рекомендуется использовать AOF с appendfsync everysec — это хороший баланс между безопасностью и производительностью.

Как происходит запись на диск в Redis? | PrepBro