LINUX.ORG.RU

Управление кешированием

 ,


0

3

Имеется набор сложных данных, объединённых в группы

Все группы имеют TTL

Есть функция доступа к данным через связи с группами FIND

Протокол доступа предусматривает три реакции в случае истечения TTL

  1. промолчать – значит можно удалить группу и данные и запустить обновление
  2. ответить ошибкой – значит можно удалить группу и данные и запустить обновление
  3. вернуть значение не смотря на устаревание – значит должен быть кеш данных

тип реакции хранится в свойствах групп

При этом, после обнаружения истечения TTL группы запускается поток обновления данных всей группы

Обновление может растянуться на 4 байта секунд в случае проблем связи

Метод обновления так же описан в свойствах группы

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

Группы и данные хранятся в uthash таблицах groups и records для хранения данных для кеша для групп с 3 типом реакции реализовал параллельную таблицу cache_groups

FIND в поисках группы оббегает сначала groups и при неуспехе ищет в cache_groups

в случает обнаружения истечения TTL ==> меняю в группе свойство active=0

и отправляю указатель на группу в очередь для обновлений

обновление подразумевает получение набора данных для генерации новых значений records для groups (разными методами)

если использовать метод первоначальной инциализации данных, а он длинный и не линейный, то получается, что FIND начнёт видеть перед кешем ещё не полностью восстановленные данные группы

как восстановить данные после обновления?

в обновлении генерировать в GROUPS скрытый для FIND набор данных для группы

или как то другому можно управлять кешированием?

★★★

Последнее исправление: fMad (всего исправлений: 1)

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

Используй мютекс для каждой группы.

если использовать метод первоначальной инциализации данных, а он длинный и не линейный, то получается, что FIND начнёт видеть перед кешем ещё не полностью восстановленные данные группы

А здесь используй семафоры. FIND будет ждать пока все этапы инициализации завершаться.

iron ★★★★★
()
Ответ на: комментарий от iron

FIND будет ждать пока все этапы инициализации завершаться.

Что это значит блокировка FIND?

FIND должен продолжать обрабатывать другие запросы, а для устаревших вытягивать из кеша

fMad ★★★
() автор топика
Ответ на: комментарий от fMad

FIND должен продолжать обрабатывать другие запросы, а для устаревших вытягивать из кеша

Так пускай продолжает работать. Но при каждой итерации пускай проверяет семафор при помощи sem_trywait(). Если данные еще не готовы то пускай продолжает обрабатывать другие запросы.

iron ★★★★★
()

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

Скрытый кэш:

Вы можете создать дополнительный кэш для каждого обновляемого набора данных. Это будет «скрытым» кэшем, который будет использоваться во время обновления данных. Когда обновление завершено, данные из «скрытого» кэша могут быть перенесены в основной кэш, и «скрытый» кэш очищен.

Временная заморозка обновлений:

Вы можете временно «заморозить» обновление группы, пока данные не будут готовы для использования. Это можно сделать, помечая группу как «не активную», и затем только после того, как обновление завершено, активировать группу снова.

Управление TTL и обновлениями:

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

Параллельное управление обновлениями и поиском:

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

Использование консистентного кэша:

Консистентный кэш может помочь вам обеспечить, что все клиенты всегда видят одинаковые данные, даже при параллельном обновлении.

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

тихо, не палите :)

ответ в таком виде идеально подходит по стилистике к тому как написана тема.

Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)

промолчать – значит можно удалить группу и данные и запустить обновление

протухло — удалил, запустил обновление.

ответить ошибкой – значит можно удалить группу и данные и запустить обновление

протухло — удалил, запустил обновление.

вернуть значение не смотря на устаревание – значит должен быть кеш данных

протухло — запустил обновление, в фоне атомарно опубликовал группу затерев старую

Как уже сказали, не понятно, в чем собственно проблема.

urxvt ★★★★★
()