Size: a a a

Android Developers

2020 May 23

AA

Ali Agzamov in Android Developers
An On
Привет. Фундаментальный вопрос про инвалидацию кэша. Допустим, на бэкенде есть метод возвращающий постранично список каких-то объектов. Хочется кэшировать их в локальную БД приложения, для просмотра оффлайн, но т.к. свойства объектов могут меняться, главным источником правды всегда остается бэкенд. Кто как поступает в таких случаях? Полностью дропаете кэш, если есть интернет и можно получить хотя бы первую страничку данных от бэкенда? Или как-то частично обновляете локальную БД? И как тогда, во втором случае, боретесь с "разрывами" актуальных данных, когда часть обновленна, часть нет, часть вообще отсутствует?
зависит от характера данных наверно. вариантов несколько
источник

I

Ivansuper in Android Developers
An On
Привет. Фундаментальный вопрос про инвалидацию кэша. Допустим, на бэкенде есть метод возвращающий постранично список каких-то объектов. Хочется кэшировать их в локальную БД приложения, для просмотра оффлайн, но т.к. свойства объектов могут меняться, главным источником правды всегда остается бэкенд. Кто как поступает в таких случаях? Полностью дропаете кэш, если есть интернет и можно получить хотя бы первую страничку данных от бэкенда? Или как-то частично обновляете локальную БД? И как тогда, во втором случае, боретесь с "разрывами" актуальных данных, когда часть обновленна, часть нет, часть вообще отсутствует?
Бэкенд должен уметь тебе давать какой то токен отвечающий за актуальность данных. Если при новом любом запросе на сервак он не сходится с кешем -- весь кеш в топку
источник

I

Ivansuper in Android Developers
Еще как менее надежный вариант -- делаешь очередной запрос на сервер. Если данные с локальным кешем разошлись -- дропай весь кеш
источник

QH

Quantum Harmonizer in Android Developers
If-Modified-Since 😏
источник

I

Ivansuper in Android Developers
Ivansuper
Еще как менее надежный вариант -- делаешь очередной запрос на сервер. Если данные с локальным кешем разошлись -- дропай весь кеш
Хотя как менее надежный ... Консистентность все равно будет
источник

AO

An On in Android Developers
Ivansuper
Еще как менее надежный вариант -- делаешь очередной запрос на сервер. Если данные с локальным кешем разошлись -- дропай весь кеш
проблема в том, что я не могу знать точно, разошлись они или нет, т.к. ответ постраничный. может на первых пяти страницах всё как в кэше, а где-нибудь потом данные будут уже несовпадать с кэшированными
источник

I

Ivansuper in Android Developers
An On
проблема в том, что я не могу знать точно, разошлись они или нет, т.к. ответ постраничный. может на первых пяти страницах всё как в кэше, а где-нибудь потом данные будут уже несовпадать с кэшированными
Тебе достаточно одной страницы. Если страница разошлась, то все невалидно. В этом и трюк
источник

I

Ivansuper in Android Developers
Если же какая то страница очередная сошлась, значит данные пока актуальны
источник

AO

An On in Android Developers
Вообще хорошим решением выглядит некий метод на бэкенде, который по хэшу локальной версии возвращает дифф данных, который можно накатить и получить полностью актуальную локальную копию. Но если нет возможности воздействовать на бэкенд, этот вариант отваливается
источник

I

Ivansuper in Android Developers
An On
Вообще хорошим решением выглядит некий метод на бэкенде, который по хэшу локальной версии возвращает дифф данных, который можно накатить и получить полностью актуальную локальную копию. Но если нет возможности воздействовать на бэкенд, этот вариант отваливается
Монструозно и неэффективно в твоем случае скорее всего
источник

AB

Anatoly Buchatsky in Android Developers
Ivansuper
Если же какая то страница очередная сошлась, значит данные пока актуальны
И что он будет грузить каждую страницу чтобы проверить кеш? В чем смысл кеша тогда, если запрос будет выполняться.
источник

AO

An On in Android Developers
Ivansuper
Монструозно и неэффективно в твоем случае скорее всего
Почему? По-моему как раз таки самый оптимальный вариант
источник

I

Ivansuper in Android Developers
Anatoly Buchatsky
И что он будет грузить каждую страницу чтобы проверить кеш? В чем смысл кеша тогда, если запрос будет выполняться.
Смысл кеша в том чтобы показывать что то во время запроса или когда сети нет
источник

I

Ivansuper in Android Developers
An On
Почему? По-моему как раз таки самый оптимальный вариант
Ну, тут тебе решать в конечном итоге
источник

QH

Quantum Harmonizer in Android Developers
An On
Почему? По-моему как раз таки самый оптимальный вариант
как это на сервере реализовать?
источник

AB

Anatoly Buchatsky in Android Developers
Quantum Harmonizer
If-Modified-Since 😏
Вот самый лучший вариант
источник

QH

Quantum Harmonizer in Android Developers
Anatoly Buchatsky
Вот самый лучший вариант
реализовать как?)
источник

I

Ivansuper in Android Developers
"накатить обновления" обычно ведет к инкрементальным долгим обновлениям в случаях когда давно не обновлялось. Проще просто с сервера хеш актуальности смотреть
источник

AO

An On in Android Developers
Ivansuper
Если же какая то страница очередная сошлась, значит данные пока актуальны
В общем-то, логичнее тогда дропнуть сразу весь кэш, если есть возможность получать данные из сети, независимо от их соответствия с локальной копией. И кэшировать по мере прогрузки (скроллинга списка). Потому что несколько "одинаковых" по содержимому страниц от бэкенде и в локальной копии всё ещё не гарантируют, что и дальше они идентичны, а туда пользователь может в итоге и недоскроллить.
источник

AB

Anatoly Buchatsky in Android Developers
Quantum Harmonizer
реализовать как?)
Это ответственность бэкенда)
источник