Как обновить данные в Redis и MySQL одновременно?
Я создаю фоновый сервис, который сводится к очень сложной системе очередей. Идея состоит в том, чтобы использовать Redis как непостоянное хранилище и использовать схему sub/pub, которая выполняется с интервалом.
Все подписчики будут за балансировщиком нагрузки. Это устраняет сложную проблему поддержания состояния между всеми серверами за балансировщиком нагрузки.
Но это порождает новую проблему... как я могу гарантировать, что непостоянные (Redis) и постоянные (MySQL) базы данных будут обновлены моими приложениями?
Кажется, что я вынужден расставить приоритеты один, и если я должен расставить приоритеты один, я буду расставлять приоритеты упорство. Но, в этом случае, что произойдет, если MySQL будет обновлен, Redis - нет, и по какой-то причине я потерял соединение с MySQL и не могу отменить мою последнюю запись?
2 ответа
Есть два возможных решения вашей проблемы:
- Следуя этим шагам:
а. Начать транзакцию MySQL сSTART TRANSACTION
б. Запустите ваш запрос MySQLINSERT INTO ...
с. Запустите команду Redis
д. Завершите транзакцию MySQL с помощьюCOMMIT
заявление в случае успешного выполнения команды Redis илиROLLBACK
если команда не выполнена
Использование преобразований обеспечивает согласованность данных в обоих хранилищах. - Написать
LUA
скрипт для Redis с использованиемLuaSQL
библиотека ( https://realtimelogic.com/ba/doc/en/lua/luasql.html), где вы будете подключаться к MySQL, вставлять свои данные и затем также отправлять команды в Redis. Тогда этот скрипт LUA может быть вызван со стороны клиента одной командойEVAL
или жеEVALSHA
Вы можете попробовать плагин mysql udf ( https://github.com/Ideonella-sakaiensis/lib_mysqludf_redis)
Смотрите пост: как перенести данные из mysql в redis