Кешування ієрархій об’єктів

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

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

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

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

Недолік полягає в тому, що з кешу доводиться витягувати кілька об'єктів, а не повний результат пошуку. Однак збереження списку ідентифікаторів робить цю процедуру досить ефективною. При попаданні в кеш повертається список ідентифікаторів, який використовується для повторного звернення до кешу. Результатом другого звернення може бути група товарів, якщо кеш дозволяєотримувати кілька об'єктів за одне звернення (memcached підтримує таку можливість за допомогою функції mget()).

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

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