Представьте следующий сценарий:Redis в качестве LRU состояния гонки кэш
- Client # 1 запрашивает объект А из Redis
- Redis ответы с нулевым
- Client # 1 запрашивает объект А из базы данных
- базы данных возвращает объект A
- Client # 1 сохраняет объект А в Redis
Все работает отлично. Давайте добавим еще один клиент между 4 и 5:
- Client # 1 запрашивает объект А из Redis
- Redis ответы с нулевым
- Client # 1 запрашивает объект А из базы данных
базы данных возвращает объект
- Client # 2 запрашивает объект А из Redis
- Redis ответы с нулевым
- Client # 2 запрашивает объект А из dtabase
- базы данных возвращает объект
- Client # 2 магазина объект А на Redis
- Client # 2 обновления объекта А, как в базе данных и Redis
- Client # 1 хранит объект A в Redis
Теперь объект A обновлен в базе данных, но устарел в Redis. Существуют ли какие-либо шаблоны для предотвращения такого поведения? Очевидно, что блокировка базы данных, ожидая, что Redis сохранит ее копию, не является решением.
Следует также отметить, что я использую NodeJS, который поддерживает пул соединений фиксированного размера для Redis, и запросы обрабатываются асинхронно, поэтому мы не можем предположить, что порядок запросов от разных клиентов не будет смешиваться в одном подключение.
Я боюсь, что команды 'watch' не работают с объединенными соединениями и асинхронной обработкой в NodeJS. Команды разных клиентов смешиваются вместе. –
@SebastianNowak Это проблема с вашей библиотекой или использованием, а не с Node.js. Я отлично использовал 'watch' /' multi' в NodeJS. Если вы добавите подробности о своем использовании, я с удовольствием покажу вам, как это сделать. –
Мне нужно было создать новое соединение с Redis для каждого клиента, чтобы заставить 'watch' работать. Это поведение объясняется здесь: http://stackoverflow.com/a/20186334/853906 и здесь: http://stackoverflow.com/a/20216928/853906 –