Кэширование входных данных стратегии обновления и обновления

#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 и сериализации/десериализации для каждого запроса и обновления. В этом случае вам нужно будет рассмотреть параллелизм, потому что ваше чтение и обновление не будут атомарной операцией.(возможно, решением может быть блокировка распространения).