ФорумРазработкаБазы данных → Решил помучить вас- снова кэширование, снова мускул

Решил помучить вас- снова кэширование, снова мускул

  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 мая 2011 г. 14:09

    Я конечно извеняюсь, но вот задумался серьёзно насчёт кэширования полученых из бд данных. Подумал так, и не верится что мускул будет сам справляться с кэшированием(даже если есть внутрение механизмы). Думаю над реализацией, а точнее архитектурой данной хрени.
    Товарищи пыхеры и пыхершы(если такие имеются) помогите плз…
    Спустя 33 сек.
    Хотябы добрым словом ;D
    Спустя 74 сек.
    memcached и других серверов не представляется возможным подключить.
    шаред мемори тоже вырублена(думаю и не помогло бы)
  • truth4oll

    Сообщения: 463 Репутация: N Группа: Адекваты

    Spritz 17 мая 2011 г. 14:12, спустя 3 минуты 7 секунд

    файловый кеш?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 14:15, спустя 3 минуты 3 секунды

    рассказывать что есть несколько драйверов/подходов/хуевин для кеширования - содрагание воздуха, банально пречислю несоклько memcache, file cache, apc, eaccelerator, xcache, redis, memcachedb и прочие …

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

    например была функция

    function dbExecute($sql)
    {
      $q  = mysql_query($sql) or die("blead krivoi zapros");
      $data = array();
      while($r = mysql_fetch_assoc($q)) $data[] = $r;

      return $data;
    }


    переделываем на подобный лад

    function dbExecute($sql, $cache = 0)
    {
      $md5 = md5($sql);
      if($data = Cache::get($md5))
      {
            return $data;
      }
      $q  = mysql_query($sql) or die("blead krivoi zapros");
      $data = array();
      while($r = mysql_fetch_assoc($q)) $data[] = $r;

      if($cache)
      {
           // key, data, expiretime
           Cache::set($md5, $data, $cache);
      }

      return $data;
    }


    ну и юзаем $topnews = dbExecute("SELECT * FROM news ORDER BY toppoints DESC LIMIT 50", 900);

    и получили "кеширующую функцию для базы" ))))))

    ну это так, на пальцах, щас придет главрыб и объяснит как правильно это делают опытные теоретики через zend_cache и прочую гламурную кисо
    Сапожник без сапог
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 мая 2011 г. 14:27, спустя 12 минут 3 секунды

    Ны это понятно, что файловых кэш.
    Про ключи тоже, вот только если данные поменялись в базе, хотельсь бы кэш обновить…
    я подумывал над тем чтобы хранить в подразделах, по таблицам. Допустим если таблица обновлена, то и кэш обновляется, а если нет то уже ищем по хэшу. Реализация драйвера в симбиозе с кэширующим механизмом это и есть главная идея реализации, вопрос только вот в эфективной системе учёта(и пливать что лишний цикл при обработки ответа мускула).

    П.С. кстати die() тут бы Попов поддержал, правдо он бы добавил от себя mysql_error() ;D
    Спустя 102 сек.
    жали конечно что доступа к рут нет, так бы воспользовался memcache в симбиозе с APC…
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 14:29, спустя 1 минуту 42 секунды

    AlexanderC, в браузере не удобно код писать, для отступов таб не работает - перекидыват на другие элементы, поэтому я обломался писать иф и трау эксепшн :-)

    ну сделай Cache::clear($key = false);

    и очищай по ключу … для удобства я бы тогда завел удобные для веширования ключи, а не мд5, а то не удобно будет запрос вписывать в инвалидацию)) я ключи обычно делаю аля "$user#$id" ну и инвалидирую по ним, ну а без параметров например очищает все кеш пространство :-)
    Сапожник без сапог
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 мая 2011 г. 14:29, спустя 46 секунд

    Кстати ну нах погружать целый фрэймворк ради клэширование. Это извращение получится…
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 мая 2011 г. 14:50, спустя 20 минут 32 секунды

    А, и вот ещё- думал хранить кэшь тоже в базе(отдельную для него создать), потому как удобно структурировать и управлять…
    Вопрос в том что целесообразно это или нет, ну и хватит ли мне TEXT или лучше хранить в бинарном виде?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 14:56, спустя 6 минут 16 секунд

    Вопрос в том что целесообразно это или нет, ну и хватит ли мне TEXT или лучше хранить в бинарном виде?

    абсолютно нецелесообразно. хранить в файлах - скорость работы будет раз так в 10 больше + на совсем простых страницах возможно вообще не придется подключаться к базе :-)

    делают кеш специально чтобы разгрузить базу … а ты в нее же родимую суешь … база хорошо, но грузить ее пусть и однотипные пиздечки простыми запросами - смысла особого нет, лучше в файлы
    Сапожник без сапог
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 мая 2011 г. 15:04, спустя 7 минут 22 секунды

    Мда, тут конечно прикланяюсь- хуйню начал нести ))))
    Если для каждой таблицы создавать папку, и отдельно для таблиц кэш обновлять норм ?
    Кстати для страниц есть отдельный файловый кэш, ток после манипуляций с базой данных он обновляется…
    Спустя 23 сек.
    … уже принялся за код…
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 15:35, спустя 31 минуту 17 секунд


    memcached и других серверов не представляется возможным подключить.
    Если у тебя серьезный проект, требующий кеширования -  то это нелепая отмазка. Иначе никакого кеширования не надо.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 15:38, спустя 2 минуты 59 секунд

    AlexB, да ладно тебе, не пугай человека)) не раз видел файловый кеш, который базу разгружает на 70-80% и в итоге все начинает летать :-)

    Сапожник без сапог
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 15:43, спустя 4 минуты 53 секунды

    Про файловый кеш, предлагаю задуматься над таким вопросом - в момент когда один пользователь зашел на страницу первый раз - генерится кеш, в этот момент туда же заходит другой пользователь (кеш еще не сгенерен) и генерация запускается снова. Потом оба процесса одновременно предпринимают попытку записать в один файл.
    Спустя 78 сек.

    AlexB, да ладно тебе, не пугай человека)) не раз видел файловый кеш, который базу разгружает на 70-80% и в итоге все начинает летать :-)
    Да я знаю, более того он у меня - основное кеширующее звено. Просто все эти отмазки про невозможно что-то поставить на мой взгдяд совершенно нелепы …
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 15:44, спустя 1 минуту 34 секунды

    AlexB, а файл локи на что?)

    можн вообще

    мастер: залочил файл, начал обновлять, обновил кеш, отлочил файл
    слейв: проверяет лок, если залочен - ждет, проверяет интервалами по 50 мс например, дождался когда файл разлочился, проверяет таймстапмы и тп, читает, если все валидно, то использует кешированную инфу.

    профит)
    Сапожник без сапог
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 мая 2011 г. 15:45, спустя 59 секунд

    А как быть с файл локам ???
    Проект для себя…
    это не highload, но хост дерьмо, а на другой переходить лень(как обычно).
    Если бы был серьёзным то там не ток кэширующий сервер нужен, но и подобающая архитектура, с маштабированием итдитп…
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 17 мая 2011 г. 15:45, спустя 8 секунд

    а так, ты просто перекладываешь 2 строки кода в мастере и вайл в слейве на мемкеш … а если зашло 100500 пользователей?) по хорошему для сложных выборок надо все равно локи использовать, хоть на уровне мема хоть на уровне файлов, похуй где в общем то)
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!