Кэширование vs DB

  • Автор темы Автор темы Redjik
  • Дата начала Дата начала

Redjik

Джедай-мастер
Вопрос про сферического коня в вакууме.

Предположим имеется 10 до 100500 статей.
Предположим что к каждой статье мы обращаемся по id (www.example.com/articles/254)

Чтобы абстрагироваться от конкретного способа хранения кэша покажу пример на yii.
В модели.
PHP:
	public static function fetchArticle($id){
		$cache = Yii::app()->cache->get('article_'.$id);
		if (!$cache){
			$cache = self::model()->findAllByPk($id);
			Yii::app()->cache->set('article_'.$id, $cache,100000);
		}
		return $cache;
	}
(Само собой при update кэш сбрасывается.)

Таким образом при повторном обращении к статье мы даже не открываем соединение с бд.
Но вот есть ли в этом смысл.

ЗЫ. закэшировал подобным образом все статьи в текущем проекте + всю текстовую информацию в ветках каталога...
 
если у тебя на сервере 64гб RAM и до 100500 статей, то, наверно, можно и кэш базы данных использовать %)

а если серьезно:
1) measure
2) then optimize
3) measure again
 
Ну сам подумай. Зависит, очевидно, от нагрузки при миссе. Например если кэшировать мемкеш во втором мемкеше то даже 1 бессмысленна ;)
 
Для вывода статей вешировать выборку бессмысленно, нужно кешировать отдельно запросы уже отрендеренную страницу или часть модуля.
Кеширование одного простого запроса по ключу особого смысла не имеет если коннекшин с базой уже установлен. то выполнится мгновенно, причём заберётся скорее всего из кеша самой бд.
 
На самом деле, кэшировать ничего не надо, пока в этом не возникла потребность.

1) Мышление "фиг с ним, что запрос тормозной, потом кэш прикручу" - неверно и чревато: во-первых, в случае мисса мы получаем тот же медленный запрос, в-полуторных, при простейшей реализации кэширования без блокировок мы получим в момент между миссом и сетом пачку медленных запросов. И во-вторых, инвалидация кэша может оказаться не такой уж и простой задачей - и если на это забить примеры можно увидеть с тупо навешенным поверх кэшем в битриксе, где на странице одно, в рсс второе, в счетчиках третье. Лучше сразу запросы оптимизировать, а если уж понадобится кэш, все равно придется решать вопрос комплексно, скорее всего оно того не стоит.

2) В случае выборки по pk - запрос быстрый изначально, и в большинстве случаев еще неизвестно, будет ли выигрыш от чуть меньшего времени чтения из мемкеша или проигрыш из-за траты такого ценного ресурса как оперативная память.

3) Упомянутый кэш статики применим, но не всегда, конечно - если на страницах множество динамики вокруг статьи, это будет скорее геморроем. Если простой статический сайт - то кэшировать лучше в файлах, отдача статического файла веб-сервером всегда эффективнее иных способов.
 
grigori
так тоже делаю, я просто взял абстрактный пример
 
Сверху