Для конкретной таблицы базы данных нам нужен кеш в памяти этих данных, который всегда синхронизируется с базой данных. Моя текущая попытка состоит в том, чтобы записать изменения в кеш в крюке after_commit
- таким образом мы не будем писать никаких изменений в кеш, которые могут быть возвращены позже.Обеспечение согласованности при кэшировании данных в байтах after_commit
Однако эта стратегия уязвима к следующему сценарию:
- замки Пронизывайте и обновляет записи, хранит дорожим
1
- Поток А совершает Изменение
- Thread B замки и обновления записей, магазины Значение
2
- Резьба B совершает замену
- Резьба B запускает крючок
after_commit
, поэтому кэш теперь имеет значение2
- Поток А запускает
after_commit
крюк, поэтому кэш теперь имеет значение1
но должно иметь значение2
Правильно ли я об этой проблеме и как бы один решить эту проблему?
Спасибо за понимание. Поскольку кеш включает целую древовидную структуру, обработка откат там будет фактически означать повторную реализацию обработки транзакций, подобную db для кэша. Просто недействительность кэша и его перезагрузка позже также будут решением, но очень сложным для древовидной структуры. Разве нет решения для решения этих проблем? – Remo
Как часто записываются записи? Как часто вы читаете записи? Насколько сложна структура в кеше? Возможно, может быть возможно оптимизировать схему базы данных для чтения вместо того, чтобы полагаться на кеширование для чтения? – spickermann
Записи могут меняться довольно часто, и это древовидная структура 50-100 тыс. Записей, поэтому я думаю, что это не вариант, читающий это (по каждому запросу) без кеширования. Запрос представляет собой вложенный запрос, который занимает около 1,4 секунды, и я не вижу большого потенциала для оптимизации там. – Remo