Как обновить Redis после обновления базы данных?

Я кэширую некоторые данные в redis и считываю данные из redis, если он существует, в противном случае считываю данные из базы данных и записываю данные в redis.

Я считаю, что есть несколько способов обновить redis после обновления базы данных.Например:

  1. установите ключи в redis в expired
  2. обновить redis сразу после обновления базы данных.
  3. поместите данные в MQ и используйте consumer для обновления redis.

Я немного смущен и не знаю, как выбрать.

не могли бы вы рассказать мне о преимуществах и недостатках каждого способа, и лучше рассказать мне другие способы обновления redis или рекомендовать какой-либо блог об этой проблеме.

1 ответов


фактическое хранилище данных и кэш должны быть синхронизированы с использованием третьего подхода, который вы уже описали в своем вопросе.

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

вы не хотите попасть в эти случаи (когда не используете служебную шину и асинхронный сервис):

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

об использовании срока действия ключа Redis, это хорошая идея. Поскольку Redis может истекать ключами с помощью встроенного механизма, вы не должны реализовывать истечение ключа из всего фонового процесса. Если ключ существует, потому что он все еще действителен.

кстати, вы не всегда будете в этом случае (если ключ не истек, это означает, что он не должен быть перезаписан). Это может зависеть от вашего фактического домена.