Які найкращі практики кешування сторінок, керованість яких може змінитись?


11

Яка найкраща практика кешування сторінок результатів пошуку, впорядкування / властивості яких можна змінити?

Скажіть, у моїй заяві хтось хоче побачити останні 20 тем для обговорення (із 10000). Запит буде надіслано до бази даних через servlet, щоб отримати перші 20 записів із таблиці дискусійних потоків як XML / JSON. Якщо вони хочуть побачити наступні 20, вони переходять на наступну сторінку результатів, і це запускає ще один запит на отримання наступного лоту (ліміт і зміщення = 20 і т.д.).

Щоб зменшити завантаження сервера та очікування клієнта, я хотів би кешувати попередні сторінки результатів. Однак у мене є два питання:

  1. Таблиця, в якій відображені результати, може бути впорядкована за більш ніж одним атрибутом (наприклад, дата створення потоку, автор потоку, дата останнього після публікації). Це означає, що твердження типу "перші 20 результатів" не має сенсу без контексту (тобто, що ми замовляємо). Яким чином передня частина повідомляє бек-енду те, що вже завантажено? Моя перша думка полягала в тому, щоб використовувати ідентифікатори для кожного результату, але надсилання їх назад на сервер за подальшими запитами (і фільтрування результатів на їх основі) буде настільки ж трудомістким, як і повернення всього назад наосліп. Як я можу це зробити?
  2. Що робити, якщо атрибут попередньо повернутого результату (тобто, найновіший-після-дати) змінився? Тоді нам потрібен спосіб перевірити кожен результат, щоб побачити, чи він був змінений на стороні сервера з моменту його створення. Як я можу це зробити?

Ваш приклад трохи брутальний. Якщо всього 100 ниток, можливо, найкраще завантажити всі 100 за один раз. Якщо ви тягнете 20 з 10 000, це вже інша історія.
Ден Пішельман

@DanPichelman Вибачте, мені було трохи незрозуміло. Це було б більше як 10 000.
goodsquishy

Відредагований номер для наочності.
goodsquishy

Це http? Якщо це так, чому б не просто кеш на основі URL-адреси? Усі параметри в URL-адресі. Якщо це браузер, спробуйте використовувати кеш браузера. Якщо це програма, встановіть термін дії кешу. Android Volley працює досить добре.
frostymarvelous

Відповіді:


7

Здається , що вам потрібно , це оболонка для всіх параметрів , які визначають сторінку (скажімо, pageNumber, pageSize, sortType, totalCountі т.д.) і використовувати цей DataRequestоб'єкт в якості ключа для вашого механізму кешування. З цього моменту у вас є кілька варіантів обробки кешу:

  • Вкажіть якийсь механізм очікування, щоб оновити кеш (залежно від того, як часто змінюються дані).
  • Попросіть слухача, який перевіряє зміни бази даних та оновлює кеш на основі вищевказаних параметрів.
  • Якщо зміни здійснюються одним і тим же процесом, ви завжди можете позначати кеш як застарілий при кожній зміні і перевіряти цей прапор, коли запитується сторінка.

Перші два можуть включати механізм планування, який повинен спрацьовувати на певному інтервалі або на основі події. Останній може бути простішим, якщо у вас є одна точка доступу до даних.

Нарешті, як зазначав @DanPichelman, він може швидко стати надмірно складним алгоритмом, який переважає переваги, тому переконайтеся, що збільшення продуктивності виправдовує складність алгоритму.


3

Я б, мабуть, впорався з цим так:

  1. Трактуйте різні впорядкування як різні послідовності разом. Додаткову бухгалтерію не варто буде відслідковувати, що має кожен клієнт (або надсилати її знову і знову).
  2. Щоразу, коли сторінки користувача відображаються негайно з кешу, одночасно надсилаючи GET на сервер, що включає або хеш, або час останнього доступу. Сервер повертає повну сторінку лише у тому випадку, якщо щось змінилось.
  3. Отримайте одночасно з сервера кілька сторінок інтерфейсу користувача. Наприклад, якщо у вашому інтерфейсі відображається 20 записів, запит 60. Мені потрібно протестувати цей, але я сподіваюся, що найефективніший розмір повернення зазвичай буде більшим, ніж середній обсяг даних, показаних на одній сторінці. Це також робить інтерфейс користувача дуже чуйним для деяких перегородок сторінок.
  4. Попередньо виберіть результати, коли ви наближаєтесь до кордону. Це допомагає зберегти такі швидкі завантаження з кешу.

2

Просто думка - у своєму виклику сервера передайте звичайні параметри плюс масив хешей MD5, що представляють кешовані в даний час керовані раніше переглянуті сторінки даних.

Зворотний дзвінок міститиме всі звичні дані для нової поточної сторінки, а також оновлення для будь-яких застарілих раніше переглянутих сторінок. Ви можете використовувати старий хеш як ключ.

Я рекомендую спочатку багато тестів на ефективність та терміни - ваш код клієнта буде набагато складнішим, ніж це було б, якщо ви просто натиснете сервер для кожної сторінки даних. Будьте впевнені, що додаткова складність призводить до значного поліпшення.


Дякую за вашу відповідь. Я думав про хешування, але не впевнений, чи допоможе це сценарій переупорядкування (тобто він недостатньо детальний і працює лише на сторінці, а не за результатами). Я думаю, що ваш останній абзац є хорошим моментом, і я починаю думати, що складність будь-якого можливого рішення переважатиме переваги від ефективності.
goodsquishy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.