Моя программа должна добавить данные в два списка в Redis как транзакцию. Данные должны быть согласованными в обоих списках. Если есть исключение или системный сбой и, таким образом, программа только добавляет данные в один список, система должна иметь возможность восстановления и отката. Но на основе документа Redis он не поддерживает откаты. Как я могу это реализовать? Я использую язык Java.Как реализовать транзакцию с откатом в Redis
ответ
Редис сделки разные. Это гарантирует две вещи.
- Все или ни одна из команд не выполняются
- последовательные и непрерывные команды
Сказав, что, если у вас есть контроль над кодом и знать, когда сбой системы будет происходить (какой-то извлечения исключения), вы можете достичь своего требования таким образом.
- MULTI -> Начать сделка
- LPUSH queue1 1 -> толкая в очереди 1
- LPUSH queue2 1 -> толкая в очереди 2
- EXEC/ВЫБРАСЫВАЙТЕ
В 4 step сделать EXEC, если нет ошибки, если вы столкнулись с ошибкой или исключением, и вы хотите откат сделать DISCARD.
Надеюсь, что это имеет смысл.
Если вам нужен откат транзакций, я рекомендую использовать что-то другое, кроме Redis. Операции Redis - это не то же самое, что и для других хранилищ данных. Даже Multi/Exec не работает для того, что вы хотите - во-первых, потому что нет отката. Если вы хотите откат, вам придется вытащить оба списка, чтобы вы могли восстановить - и надеемся, что между нашим условием ошибки и «откатом» ни один другой клиент также не изменил ни один из списков. Выполнение этого разумным и надежным способом не является тривиальным и простым. Вероятно, это тоже не был бы хорошим вопросом для SO, поскольку он был бы очень широким, а не специфичным для Redis.
Теперь о том, почему EXEC не делает то, что можно подумать. В вашем предложен сценарий MULTI/EXEC только обрабатывает случаи:
- Вы создали часы, чтобы гарантировать, что никакие другие изменения не произошло
- Ваш клиент умирает до выдачи EXEC
- Redis это из памяти
Вполне возможно получить ошибки в результате выдачи команды EXEC. Когда вы выдаете EXEC, Redis выполнит все команды в очереди и вернет список ошибок. Он не будет содержать случая, когда работающий и добавленный к списку список 2 не работает. У вас по-прежнему будут отсутствовать синхронизация ваших двух списков.Когда вы выдаете, скажем, LPUSH после выдачи MULTI, вы всегда получите обратно OK
, если только вы:
- а) ранее добавил часы и что-то в этом списке изменен или
- б) Redis возвращает состояние ООГО в ответ на команду push queued
DISCARD не работает, как некоторые могут подумать. DISCARD используется вместо EXEC, а не как механизм отката. После того, как вы выдадите EXEC, ваша транзакция будет завершена. У Redis вообще нет механизма отката - это не то, что касается транзакции Redis.
Ключом к пониманию того, что Redis называет транзакциями, является осознание того, что они по сути являются командной очередью на уровне клиентского соединения. Они не являются конечным автоматом базы данных.
- 1. Как реализовать транзакцию в Spring Data Redis в чистом виде?
- 2. Как выполнить транзакцию в таблице очередей базы данных с откатом?
- 3. PDO, потерявший транзакцию перед фиксацией/откатом
- 4. Как реализовать транзакцию?
- 5. Как реализовать транзакцию в knex?
- 6. Как реализовать распределенную транзакцию в CouchDB?
- 7. Как реализовать транзакцию в слое бизнес-логики
- 8. Как реализовать транзакцию MultiThreaded в C#?
- 9. Как реализовать Redis Multi-Exec с использованием Spring-data-Redis
- 10. Как использовать транзакцию в Snowflake?
- 11. Как реализовать пользователей на Redis с zsets
- 12. Как реализовать ограничение скорости с помощью Redis
- 13. Как реализовать ServiceStack Redis Client с таймаутом
- 14. tsql mutiple inserts в транзакции с откатом
- 15. Как реализовать временные лидеры с Redis?
- 16. Как реализовать транзакцию, управляемую контейнером (CMT)?
- 17. Реализовать обработчик сеансов в Redis
- 18. Проблемы с откатом в p4
- 19. Как использовать транзакцию mysql в wordpress?
- 20. Как реализовать redis session expire в aiohttp
- 21. Ошибка с откатом MySQL
- 22. Как справиться с откатом транзакций в @PreUpdate
- 23. Домен с откатом IP
- 24. Как реализовать транзакцию JPA с помощью приложения Spring Boot?
- 25. Как реализовать безопасную транзакцию, случайную последовательность в MySQL
- 26. Операции доступа в коде с фиксацией и откатом
- 27. Как реализовать множественную транзакцию проверки NULL в mysql
- 28. Брандмауэр Django redis или как его реализовать
- 29. Как реализовать «триггер» для хранилища redis?
- 30. Весенние тесты - проблемы с откатом