Правильно кеширование

soines

Новичок
Правильное кеширование

Задался целью написать кэш для своего движка, но уперся в стенку.
Есть что-то вроде ORM с примерно таким интерфейсом:
PHP:
$id = 5;
$article = ORM::factory( 'article' );
$article->find( $id );
Закэшировать статью в таком случае легко, просто добавляем в тот-же memcache данные с ключом article:5, при редактировании - дропаем кэш или заменяем его ( это в принципе неважно, интерфейс все равно остается такой же ).

Вся загвоздка заключается в том, что нам, например, нужно получить все статьи из определенной категории.
PHP:
$category = 10;
$articles = ORM::factory( 'article' );
$articles->find( $category, 'category_id' );
Но как кэшировать в данном случае? Как вариант при запросе вытаскивать не все поля, а только удовлетворяющие нас id`шники, потом смотреть есть ли данные в кэше или нет. Но хорошо если они есть в кэше, то у нас будет 1 запрос, а если нету, то 1+n запросов, что не есть гуд.

Другой вариант, что при данном поиске вытаскивать все данные из базы, но в кеш класть отдельно каждую статью article:1, article:2 и т.д. и создавать записать вида article#category_id:10, где будет массив ( 1, 2, и т.д. ) тогда при поиске мы получим id необходимых нам статей и потом будем проверять есть ли они в кэше или нет. Но здесь есть другая проблема: при редактировании заголовка статьи мы просто обновим её, поиск по категории будет актуальным. Но если мы захотим сменить категорию, то как мы узнаем что нужно дропнуть запись article#category_id:10?

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

zerkms

TDD infected
Команда форума
а зачем ты кешируешь в этом месте?
в смысле - именно процесс извлечения.
 

soines

Новичок
zerkms, в этом ты имеешь про поиск по категориям? Или вообще?
 

zerkms

TDD infected
Команда форума
Вообще, я спрашиваю, что тебя побудило кешировать то, что как ты видишь - плохо кешируется.
 

soines

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

Лучше кэшировать уже сгенерированный html? А если одни и те же данные могут отдаваться как в html и json, то разумнее ведь кэшировать именно данные, или нет?


Пример со статьями придуманный, он просто как пример.
 

zerkms

TDD infected
Команда форума
Кеширование относится к тому роду нетривиальных задач, для которых универсального решения не существует.
Что-то ты напишешь. Будет ли от этого хоть какой-то ощутимый выхлоп (если только не станет хуже) - очень сомневаюсь.
 

soines

Новичок
Что-то ты напишешь. Будет ли от этого хоть какой-то ощутимый выхлоп (если только не станет хуже) - очень сомневаюсь.
Фраза относится лично ко мне или вообще к подобным идеям?

Почему может стать хуже если данные не будут каждый раз дергаться из базы?
 

zerkms

TDD infected
Команда форума
soines
вообще.

Почему может стать хуже если данные не будут каждый раз дергаться из базы?
потому что mysql работает чертовски быстро для твоих задач. примерно 5-7k/s (что для тебя, признайся, выше крыши) запросов на выборку у тебя будет производительность из коробки. если приложить экспериенс и знания - то получится выжать 20k и более.
 

soines

Новичок
zerkms, ну ты же не знаешь мои задачи. Конечно же я не говорю о каком-то хайлоуде, но сложилась ситуация, когда запросов ~350-400, мне это не нравиться, поэтому я и хочу придумать более оптимальное решение. да можно было обойтись меньшим количеством запросов, но так получается отчасти из-за архитектуры приложения.
 

zerkms

TDD infected
Команда форума
да можно было обойтись меньшим количеством запросов
зачем? ты уверен, что ты сможешь построить кэш, который будет быстрее mysql.
и ты так и не ответил явно - 5k/s запросов на чтение для тебя мало?
 

soines

Новичок
Нет, не уверен. Ведь именно из-за этого я и спросил совета на форуме.

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

zerkms

TDD infected
Команда форума
Фишка в том, что лишний слой сейчас у тебя всё усложнит. А когда проект выйдет в продакт и под нагрузку - то "внезапно" окажется, что кешировал ты совсем не то, что нужно было. И окажется, что это не качественная работа - а трата времени на то, что потом будет выкинуто.
 

С.

Продвинутый новичок
soines, во-первых, определись, чтО ты будешь кешировать (данные, верстку, данные и верстку)? Обрати внимание, что кешировать слишком мелкие курпускулярные данные, как то отдельные записи из базы данных -- абсолютная глупость. Кешировать надо БЛОКИ достаточной объемности.

Во-вторых, надо кешировать НЕИЗМЕНЯЕМЫЕ блоки (читай "достаточно редко изменяемые" блоки). У такого блока может быть только один признак "устарел" или нет (желательно взводящийся не слишком часто). Какие именно в нем курпускулярные части изменились, никого не должно волновать, кроме Лукавого.
 

korchasa

LIMB infected
С.
Неправда. Кешировать нужно не неизменяемые блоки, а ДОРОГИЕ. И не блоки даже, вполне могут быть и отдельные записи, если их по каким-то причинам дорого доставать (другой датацентр, сторонный сервис). И признаков может быть больше одного, например, "устарел для зарегистрированных пользователей", "устарел для премиум пользователей", "устарел для модераторов". Вообще не стоит человеку без опыта давать готовые решения. Пусть он лучше подумает - оно полезно.

zerkms
+1

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