![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| BuShaRt |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1391 Регистрация: 29.6.2006 Репутация: 4 Всего: 6 |
На работе поставили задачку, прикрутить мем-кеш к системе.
Абстрактно система следующая: 1. Есть объекты блокнотов. (id, title, owner_id) 2. Есть объекты записей, привязанных к блокнотам. (id, title, owner_id, content, notebook_id) 3. Есть связь между пользователями системы (владелец еще может шарить блокнот другим пользователям) (notebook_id, user_id) Вопросов будет несколько. 1. Во первых есть ли смысл это кешировать? (Лично я считаю, что запросы в эти таблица дешевы и кеш тут ненужен - руководство ествественно думает иначе) 2. Во вторых. Представим, что кешировать надо независимо от того хотим или нет. Какой подходк к кешированию этих данных был бы оптимальным? 3. Руководство хочет кешировать все это дело как один большой объект блокнтота. Это нормально? Какие могут быть подводные камни? 4. И вопрос, выходящий далеко за рамки этой задачи (интересует меня уже давно). Вот настроили мы кеширование ( не важно одним большим объектом или кучей маленьких) и встала у нас задача произвести выборку всех блокнтово определенного пользователя, созданных за последнюю неделю. Естественно из кеша мы выборку не сделаем - обращаемся к базе данных. Выходит, что у нас теперь два подхода к инициализации объекта: брать его из кеша или из базы. Есть какие-нибудь подходы (паттерны) к реализации этой функции? |
|||
|
||||
| Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
Что кэшить может подсказать только профайлер, тупой замер всего базы запросов, функции которые кажется тяжелыми.
Дешевле ngnix кэшить результат почти мгновенная отдача пользователю всей страницы (пример сайт) Кэш стандартный на страницы 1-2 мин можно даже memcache прекрутить. Нужен только сброс кэша что бы сбрасывать кэш можно отправлять на туже страницу при добавлении или изменении записи какой не будь заголовок, куку Блочный кэш спасает до пары до времени 4 уникальный ключ состоящий из параметров запроса к базе + можно сделать специальный контейнер кэш который хранит список ключей что бы при действия к базе очистить нужную группу кэша, все зависит сколько нужно очещать.
Когда данных будет очень много кэш оправдает себя особенно если там есть сортировка и условия поиска по дате. Это сообщение отредактировал(а) Sanchezzz - 14.3.2013, 19:53 -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Вопросы ставятся и решаются не абстрактно, а по мере анализа ситуации. Промерить время, затраченное на вычисление запросов, посчитать выигрыши по кэшированию... Посчитать насколько оно нужно. Первым делом нужно запустить профайлер и вычислить тонкие места.
Если сервер только один - нужно думать кому отдать память - nginx'у для кэширования или memcache. Наиболее простой, понятный и, как правило, эффективный метод - кэшировать запросы в базу, используя md5 от самого запроса как ключ. Некоторые проблемы будут с парными запросами, например `select SQL_CALC_FOUND_ROWS ...` и парный к нему `SELECT FOUND_ROWS() `,их нужно кэшировать единовременно. В любом случае - само кэширование вне уровня драйвера базы данных совершенно прозрачно, вся работа по получению данных ведется тем-же комплектом sql запросов. При таком подходе 4 вопрос лишается смысла. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 20 Всего: 42 |
С какого фига не сделаем? Только если кешу не хватило памяти и ключи оказались вытесненными. Но ksnk, правильно заметил. С точки зрения получения данных процесс должен быть абсолютно прозрачным для кода. Не играет роли из кеша или БД. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |