Я тут немного эксперементирую с GreenSock и готовлю новые интерфейсы для GFW – вот что пока получается
Правда из библиоетчки я взял только эффекты ScrollRectPlugin и SetSizePlugin
Programming by Python, JavaScript, ActionScript, PostgreSQL, MySQL for Game Creation and Web Develop. Also about Open Source, Debian and Project Management.
Я тут немного эксперементирую с GreenSock и готовлю новые интерфейсы для GFW – вот что пока получается
Правда из библиоетчки я взял только эффекты ScrollRectPlugin и SetSizePlugin
Для тех, у кого отсчет интернета начинается с моего блога и у кого он стоит как домашняя страничка. Для тех кто каждое утро начинает имено с просмотров его статей.
Не волнуйтесь, все нормально. Просто у нас переезжал сервер и мы немноШечко лежали. Сейчас все ок. Буду продолжать радовать вас своими статьями и идеями.
Да, я сегодня утром проснулся и решил накатить обновления убуны на свой ноут. Надеюсь продолжительная эпопея с подобными обновлениям Дебчика ( 1 , 2 , Убунта ) – не повторятся.
Поэтому… пока оно накатывается… скиньте… у кого, какие были проблемы… чего мне ждать? ну кроме того, что у меня почти стопудово слетят проприетарные атишные драйвера.
Пока из всего, что прослушал – очень понравился Omar (Omar Akram) Full Discography (2002-2007) :: 3CD
Кто прется по подобным вещам, скинте в комменты ссылки.
Всем привет. Да, знаю, я давно не писал. Ну простите, и как это не банально, был занят. А заставила меня написать одна мысля. И пожалуйста, дочитайте это до конца, потому что или это очень круто или я опять что то не понимаю, и с температурой 38 мне лучше за клаву не садиться.
Кеш. Я им пользуюсь для того, чтобы данные, которые я долго вычисляю — положить в память куда нить, чтоб если они понадобились — быстро их оттуда взять. Ну а если их там нет, то просто пересчитать и положить. Если вы им пользуетесь также, то читайте дальше иначе напишите комментарий, который начнется со слов: «Тю, блин, а я его совершенно по другому юзаю, глянь…»
Т.е. на сетах и гетах все сводится к примерно следующему алгоритму.
где l_value — это ссылка на функцию, значение которой будет получено, в случае если его нет в кеше.
Вот этот умопомрачительный алгоритм у меня лежит в основе кеширования.
Хух… если у вас также, то идете дальше. Надеюсь сейчас осталось достаточно народу.
Прогуливаясь легкой и непринужденной походкой по блогосфере рунете я уже в который раз натыкаюсь на довольно странное решение следующей проблемы.
Если есть какие либо данные которые системе нужны часто, но вычисляются долго, то их прямое получение по алгоритму, описанному выше — просто убивает систему. Потому что как только они пропадают из кеша — все, кому нужны эти данные — начинают скопом — все вместе их получать. Например статистика по пользователям у вас вычисляется 5 сек, а выводится на главной странице, с посещаемостью 50 чел в сек, значит одновременно эти данные будут получать 250 процессов – что, может привести к смерти.
Решение рунета — 2 кеша. В один кладем с одним эксперейшеном, в другой с таким же, но чуть больше. Я думаю многие натыкались на такие решения, но вкратце — если заэкспаирилось в первом — берем из второго, но первый, кто узнал, о том, что заэкспаирилось — пересчитывает.
Тут просто тьма тьмущая узких мест
1.Старт у системы должен быть особый. Т.е. в нулевой точке в кеше уже должны быть часто доступные данные.
2.У вас двойные данные в кеше, т.е. две копии, а ведь часто бывает и такое, что трудновычисляемые данные — это и большие данные.
3.И последнее — если процесс, который вычисляет заекспаревшиеся данные — умирает. То умирают все. Явно теряем в отказоустойчивости.
Кратко опишу свой алгоритм решения, и построенный на нем джанговый кешовый бекенд (за базовый взят мемкешовый).
Если в ячейку с ключем класть не данные, а хеш из двух значений — данные, и время, когда их надо обновить. (ТАДАМ избавились от второго пункта)
А что если ты перед началом вычислений будеш класть в другой системый и уникальный ключ в кеше время, когда первый, начавший вычисления – планирует их закончить. А остольные процессы, которые захотят получить данные и не увидят их — смогут орентироваться на системный ключь, чтоб понимать, что данные скоро будут и их необходимо подождать или мы не дождались и попробуем еще раз. (ТАДАМ избавились от первого и третьего)
А теперь скучный код. Чтоб легче было читать — его необходимо скрестить с алгоритмом, который я описывал выше. И если функция гет — вернет None то эти данные сразу начнут вычисляться.
Небольшой рандом необходим, чтоб все процессы сразу не набросились вычислять после первого сдавшегося, а нарастающий таймаут необходим для быстрого избавления от быстрых данные и размеренного ожидания долгих.
И на всякий случай. Если вы все таки считаете это отличной идее. Кладем это в файлик с незамысловатым названием smart_cache.py рядом с settings.py, а в settings.py записываем
Recent Comments