Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Кеширование отдельных объектов


Автор: qsajeal 5.7.2009, 11:10
Доброго времени суток!!!

Есть проблема.
Допусти у нас выводится список топиков. Эти топики связаны с другими объектами (пользователи, их автары, блоги и т.д.) Если мы выберем скажем 50 топиков одним запросом с кучей джоинов и закешируем его, то, например, когда у нас изменится аватар одного из пользователей, то нам прийедтся сбрасывать кеш для ВСЕХ подобных пачек с топиками.

Вопрос как этого избежать? Как построить кеширование, чтобы при изменении аватара - сбрасывался кеш только топиков этого автора?

Я предлагал такое решение: сначала выбираются айдишники этих объектов, а потом в соответствии с этим списком выбираются объекты поштучно. Т.е. 50+1 запрос.  Если выбирать только ID, то наверное можно добиться их поиска только по индексу (covering), хотя это сложно тоже достаточно...

А как ВЫ решаете эту проблему?


Автор: skyboy 5.7.2009, 12:00
Цитата(qsajeal @  5.7.2009,  10:10 Найти цитируемый пост)
то, например, когда у нас изменится аватар одного из пользователей

как организуется кеш?
в течене какого времени он живет - на время формирования одной страницы или ограниченное время?

Автор: qsajeal 5.7.2009, 17:25
>как организуется кеш?

Ну я уже много способов перепробовал, вы расскажите лучше как по вашему нужно его организовывать?

>в течене какого времени он живет - на время формирования одной страницы или ограниченное время? 

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

Я вот кроме как способа с кешированием отдельных объектов ничего придумать не могу. Т.е. Кеш пачки (с айдишниками объектов)+ много кешей каждого из объектов.
Но это не кошерно как-то 100 запросов в мемкеш на 100 комментов, поэтому и спрашиваю вас.

Автор: skyboy 6.7.2009, 11:38
Цитата(qsajeal @  5.7.2009,  16:25 Найти цитируемый пост)
в мемкеш

о, значит, memcache.
в таком случае(теоретическое предположение - с memcache я не работал), можно использовать механизм тегов. и всему, что кешируется для объекта "пользователь #100" задавать соответствующий тег. И при изменении информации сбрасывать кеш только для элементов с соответствующим тегом.

Автор: qsajeal 6.7.2009, 13:44
Мда уж... Если вы внимательно прочтитаете мой вопрос, то поймете какую глупость написали... (извините за резкость)

Теги не обязательно для мемкеша только. Их можно сделать и для файлов и APC и чего хочешь. Это лишь отдельные key-value пары с информацией.
Здесь вопрос совсем в другом. 

Чтобы сбросить пачку комментов для данного топика нам надо сделать к нему 100 тегов всех юзеров, 100 тегов всех аватаров и т.д. Ну поняли? Чтоб не сбрасывать кеш для комментов ВСЕХ топиков,а тольк для топиков, у которых комменты добавил данный юзер, изменивший аватар.
А в реальных проектах таких связей ОЧЕНЬ много (здесь только для примера комменты)

Добавлено через 5 минут и 26 секунд
Надеюсь почему 200 тегов к одному  кешу - зло - вам понятно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)