Какая лучшая стратегия для синхронизации данных Redis с MySQL?

  • Вариант использования - использовать Redis для локального кэша MySQL
  • Формат данных в MySQL: один первичный ключ и несколько других полей. Не будет запросов перекрестной таблицы db
  • Ключ Redis является первичным ключом в MySQL, а значение hash содержит другие поля в MySQL
  • При отключении питания допустимо потерять менее одной минуты данных.

Мое решение:

  • Redis пишет файл AOF, некоторые процессы будут отслеживать этот файл и синхронизировать обновленные данные с MySQL
  • Hack Redis для записи AOF в нескольких файлах, подобно MySQL binlog
  • Интерфейс данных будет читать и писать только через Redis

Является ли это решение ОК?
И какая лучшая стратегия для этой работы?

Ответы

Ответ 1

Вам не нужно ничего взломать;)

Я не совсем уверен, зачем нужны данные о mysql. Если бы я знал, возможно, был бы более подходящий ответ. В любом случае, в качестве общего ответа вы можете использовать redis keyspace notifications

Вы можете подписаться на команды HSET, HMSET, HDEL и DEL на ваших клавишах, чтобы вы получали уведомление каждый раз, когда ключ был удален или значение хеша установлено или удалено.

Обратите внимание, что если вы пропустите какое-либо уведомление, у вас будет несогласованность. Поэтому время от времени вы можете просто использовать команду SCAN, чтобы пройти все ваши ключи и проверить mysql, если они нуждаются в обновлении.

Другой стратегией может быть поддержка двух отдельных структур. Один из них будет хешем со значениями, а другой будет ZSET всех значений, отсортированных по метке времени обновления. Лучший способ обновить обе структуры - это написать два или три сценария lua (вставить/обновить и удалить), которые будут работать на хэше и zset атомарно.

Затем вы можете просто запросить ZSET для элементов с отметкой времени выше, чем ваша последняя операция синхронизации, получить все ключи, которые были обновлены (они будут включать удаленные ключи, если вы не хотите, чтобы второй ZSET был исключительно для них) а затем просто извлекать все элементы с помощью ключа и синхронизировать с mysql.

Надеюсь, что это сработает для вас!

Ответ 2

вы можете реализовать redis replication протокол.
но для ваших требований существует проект github.

стабильная версия 2.3.1

<dependency>
    <groupId>com.moilioncircle</groupId>
    <artifactId>redis-replicator</artifactId>
    <version>2.3.1</version>
</dependency>