Покритикуйте моё первое "кэширование"

флоппик

promotor fidei
Команда форума
Партнер клуба
Логику по заполнению кэша дублировать плохо?
А причем тут логика заполнения кеша? Если кеш меняется в другом месте, относительно других условий — это уже другая логика. Просто кеш общий.
А ваш сервис должен будет знать всю структуру приложения, что бы работать. И если отвалится, то приложение работать не будет.
который умеет отдавать данные и заполнять их, если пусто.
Thank you, Captain Oblivous! Please, take this rock!
Кеш — это тот сервис, который
умеет отдавать данные и заполнять их, если пусто.
 

Духовность™

Продвинутый новичок
Мм, весело, если по каким то причинам кэш потерялся, то пользователи будут лицезреть пустую страничку пока админ не обновит страницу.
В шаблоне метод get возвращает строку - содержимое кэша. Если кэша не существует, то он создается.
-~{}~ 25.10.08 15:09:

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

pilot911

Новичок
Автор оригинала: triumvirat
почему пожирать ресурсы? с чего Вы взяли?
представь, в админке изменилась одна запись чего-либо.. например, новости

из этого следует, что система должна сразу же перестроить кэш на всех страницах, где эта новость может появляться

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

HraKK

Мудак
Команда форума
Я думаю использовать полностраничный кеш это очень частная ситуация. Очень. Для сайтов визиток.
 

MiksIr

miksir@home:~$
Ну например если на странице 10 разных блоков с приблизительно одним временем жизни - почему бы и не полную страницу кешировать. Да и вообще, что понимать под полностраничным ;) Например, мы реализовываем блочное кеширование через ssi - для бекенда по сути каждый такой блок - страница ;)
 

Духовность™

Продвинутый новичок
из этого следует, что система должна сразу же перестроить кэш на всех страницах, где эта новость может появляться

а это могут быть десятки и сотни страниц..
Ещё раз идея.


Допустим, есть топовая новость, выводящаяся анонсом на главной странице или в шапке сайта на каждой странице. Поменяли мы эту новость - меняется 1 файл с html кодом этого анонса. В дальнейшем при запросе какой-либо страницы этот файл погружается с помощью include PHP или SSI. Никакие десятки и сотни кэшев перегенерировать не надо.
 

MiksIr

miksir@home:~$
triumvirat, не только.. меняется еще новость на странице новостей, новость в архиве, новость на внутренней странице, ибо на главной мы 5 первых выводили, а на внутренней - 3 ;) И тебе это надо все не забыть запрограммировать при прегенерации кеша.
 

korchasa

LIMB infected
Автор оригинала: флоппик
А причем тут логика заполнения кеша? Если кеш меняется в другом месте, относительно других условий — это уже другая логика. Просто кеш общий.
Мы говорим о каких то разных кэшах. Кэш это не сервис, кэш это "быстрая" копия данных.

Автор оригинала: флоппик А ваш сервис должен будет знать всю структуру приложения, что бы работать.
Всю структуру это вы перегнули. Он будет знать только о способе получения данных, которые у него запросят + умеет работать с кэшом (хранилищем). Например:

PHP:
<?php

class MemberCacheService
{
  static function remove($member_id)
  {
    $cache = lmbToolkit :: instance()->getMembersCacheConnection();
    $cache->delete('member_' . $member_id);
  }

  static function findById($member_id)
  {    
    $cache = lmbToolkit :: instance()->getMembersCacheConnection();

    if(!$member = $cache->get('member_' . $member_id))
    {
      if(!$member = lmbActiveRecord :: findById('Member', $member_id, false))
        return null;

      ...

      $cache->set('member_' . $member_id, $member, $conf['ttl_member']);
    }

    return $member;
  }
}
Автор оригинала: флоппик И если отвалится, то приложение работать не будет.
Как код может "отвалиться"?

Автор оригинала: MiksIr
triumvirat, не только.. меняется еще новость на странице новостей, новость в архиве, новость на внутренней странице, ибо на главной мы 5 первых выводили, а на внутренней - 3 ;) И тебе это надо все не забыть запрограммировать при прегенерации кеша.
Перегенерация кэша имеет смысл для защиты от dog-pile эффекта, в любом другом случае это потенциально лишние операции(и лишнее данные в хранилище), ибо не факт что кто-то посмотрит страницу архива, до того, как разместят следующую новость.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Как код может "отвалиться"?
верно до тех пор пока кеш в обычных файлах на этой же машине.
-~{}~ 25.10.08 22:05:

только о способе получения данных
круто. получение данных — это и есть добрая половина приложения. А если изменится структура приложения?
 

korchasa

LIMB infected
флоппик
С чего бы из-за этого упал приведённый мною сервис? Он не устанавливает соединения, а использует существующее. Разрешение ситуации с недоступностью хранилища происходит прозрачно для него в методе getMembersCacheConnection(), с помощью подмены объекта соединения на фейк, имплементирующий тот же интерфейс, что и рабочее соединение.

Автор оригинала: флоппик
круто. получение данных — это и есть добрая половина приложения. А если изменится структура приложения?
То придётся менять код внутри сервиса. Только внутри него, т.к. никто больше не знает как эти данные получать. Тоже самое пришлось бы сделать если бы сервиса не было. Понятно, что такой подход не является единственно правильным, но он позволяет абстрагироваться от хранилища данных (кэш/база) и избавиться от дублирования кода, в случае если использование одних и тех же данных(для которых возможно есть кэш) происходит в нескольких местах приложения.
 
Сверху