2016-09-07 2 views
1

Для конкретной таблицы базы данных нам нужен кеш в памяти этих данных, который всегда синхронизируется с базой данных. Моя текущая попытка состоит в том, чтобы записать изменения в кеш в крюке after_commit - таким образом мы не будем писать никаких изменений в кеш, которые могут быть возвращены позже.Обеспечение согласованности при кэшировании данных в байтах after_commit

Однако эта стратегия уязвима к следующему сценарию:

  1. замки Пронизывайте и обновляет записи, хранит дорожим 1
  2. Поток А совершает Изменение
  3. Thread B замки и обновления записей, магазины Значение 2
  4. Резьба B совершает замену
  5. Резьба B запускает крючок after_commit, поэтому кэш теперь имеет значение 2
  6. Поток А запускает after_commit крюк, поэтому кэш теперь имеет значение 1 но должно иметь значение 2

Правильно ли я об этой проблеме и как бы один решить эту проблему?

ответ

1

Решение, которое мы разработали, состоит в том, чтобы заблокировать кеш для чтения/записи before_commit и разблокировать его в after_commit. Кажется, это трюк.

2

Вы правы в этой проблеме.

Существует обратный вызов after_save, который выполняется в рамках одной и той же транзакции. Возможно, вы захотите использовать этот вариант вместо крюка after_commit, который запускается после транзакции.

Но вам придется иметь дело с откатной транзакцией самостоятельно.

Или вы можете написать свой метод кэширования таким образом, чтобы он не зависел от конкретного экземпляра. Но вместо этого кэширует последнюю версию, которая находится в базе данных, сначала перезагружая запись из базы данных.

Но даже при этом: многопоточные системы сложно синхронизировать. И вы даже не можете гарантировать, будет ли сохранено первое или второе обновление в вашем кеше, потому что система кэширования может быть также многопоточной.

Возможно, вы захотите прочитать о different consistency models.

+0

Спасибо за понимание. Поскольку кеш включает целую древовидную структуру, обработка откат там будет фактически означать повторную реализацию обработки транзакций, подобную db для кэша. Просто недействительность кэша и его перезагрузка позже также будут решением, но очень сложным для древовидной структуры. Разве нет решения для решения этих проблем? – Remo

+1

Как часто записываются записи? Как часто вы читаете записи? Насколько сложна структура в кеше? Возможно, может быть возможно оптимизировать схему базы данных для чтения вместо того, чтобы полагаться на кеширование для чтения? – spickermann

+0

Записи могут меняться довольно часто, и это древовидная структура 50-100 тыс. Записей, поэтому я думаю, что это не вариант, читающий это (по каждому запросу) без кеширования. Запрос представляет собой вложенный запрос, который занимает около 1,4 секунды, и я не вижу большого потенциала для оптимизации там. – Remo

 Смежные вопросы

  • Нет связанных вопросов^_^