#database #caching #redis
Вопрос:
Я создаю кэш Redis для хранения данных о продукте, например
Пары Ключ — значение, как
key -gt; testKey value [json] -gt; { "testA" : "A", "testB" : "B", "testC" : "C" }
Проблема, с которой я борюсь, заключается в том, что я получаю два запроса на обновление этого значения для ключа.
запрос 1 на изменение -gt; «TestB» = «Bx»
запрос 2 на изменение -gt; «testC» = «Cx»
Как справиться с непоследовательностью. Как я понимаю, один запрос будет считывать вышеуказанные данные и обновлять только значение TestB, а другой запрос обновит значение testC, потому что они выполняются параллельно, и любой новый запрос не ожидает распространения последнего обновления в кэше.
Как мы поддерживаем согласованность данных с Redis ?. Я могу подумать о блокировке с использованием базы данных транзакций спереди, но это уменьшит задержку данных в реальном времени.
Комментарии:
1. «они работают параллельно» неверно. Redis однопоточен,и отдельные команды (например
HSET
) являются атомарными. Таким образом, в операциях, о которых вы упомянули, нет условий гонки.
Ответ №1:
Это зависит от того, какую структуру данных вы выбрали в Redis.
В вашем случае хэш будет хорошим способом сохранить все поля в ваших значениях. И используйте команду HSET для обновления целевых полей, что может гарантировать, что ваши запросы на обновление обновят только одно поле. И все команды Redis будут выполняться последовательно, так что у вас не возникнет проблем с параллелизмом.
Также вы можете использовать строку для хранения необработанных данных json и сериализации/десериализации для каждого запроса и обновления. В этом случае вам нужно будет рассмотреть параллелизм, потому что ваше чтение и обновление не будут атомарной операцией.(возможно, решением может быть блокировка распространения).