качество и надёжность с 2008 года

8 (800) 200-25-11

Техническая поддержка support@komtet.ru —

круглосуточно и без выходных дней

load-whois

Онлайн-касса

для интернет-магазина

Подключите ваш интернет-магазин

к онлайн-кассе в соответствии с 54-ФЗ

Главная Техническая библиотека Фреймворки Pylons Beaker 1.3 сочное высококачественное кеширование

Beaker 1.3 сочное высококачественное кеширование

В статье "Beaker 1.3 is juicy caching goodness" автор говорит об основных усовершенствованиях Beaker 1.3 и о его добавлении Декораторов для данной версии.

Вышел Beaker 1.3, фактически, он вышел уже некоторое время назад, а я не успел обсудить в блоге этот факт. Стыдно, но я был  слишком занят в последнее время, чтобы заняться этим раньше, потому что в дополнение к некоторым исправлениям ошибок, он имеет несколько полезных новых функций, которые делают его еще более простым в использовании на любых скриптах/приложениях/фреймворках Python.

Основные исправления ошибок в Beaker 1.3:

  • Исправлена ошибка (non-cookie-only) c разрывом сессии;
  • Исправлена ошибка (cookie-only) с сессиями, отправляющими cookies, когда это не предполагалось;
  • Исправлена ошибка с неавтоматическими сессиями, неправильно сохраняющими время последнего действия.

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

У Beaker всегда был механизм работы сессии и кэширования, я до сих пор нигде не видел этого, за исключением Pylons. Я видел, как используют SessionMiddleware в других фреймворках на основе WSGI, но не кэширование, что странно, так как оно:

  • поддерживает различные backends: database, file-based, dbm file-based, memcached;
  • имеет блокирующий код для реализации моделей «один писатель», «много читателей» (это позволяет избежать эффекта dog-pile, который наблюдается в системе кеширования Django!)

Для клиентов, которые столкнулись с функцией кеширования, в то время, когда она была уже восстановлена, Beaker предоставляет старую копию, пока новый контент не будет готов. Это избавляет от эффекта dog-pile, и сохраняет высокую скорость сайта для большого количества пользователей. Так как использованная блокировка диско-зависима, то это означает, что Вы избегаете этого эффекта только на 1 машине (если вы не используете NFS или SAN), таким образом, если у Вас 20 машин в кластере, самое худшее, что Вы можете получить состоит в том, что у Вас будет 20 новых сгенерированных и сохраненных копий.

Теперь, с целью стимулировать более частое использование Beaker 1.3,  я добавил несколько декораторов, для упрощения кеширования. Также, благодаря предложениям Mike Bayer, у нас теперь есть области кеш, для сокращения времени кеширования.

Области Кеш

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

  • Долгосрочный, подходящий для сервера баз данных (при использовании в кластере);
  • Краткосрочный, не кешируется так долго, возможно с помощью memcached.

Чтобы настроить их, просто задайте в Beaker области, которые Вы собираетесь определить, и присвойте им нормальные кеш-параметры для каждой области. Например, в этом приложении Pylons, я определяю 2 области кеш в INI:


beaker.cache.regions = short_term, long_term
beaker.cache.short_term.type = ext:memcached
beaker.cache.short_term.url = 127.0.0.1:11211
beaker.cache.short_term.expire = 3600

beaker.cache.long_term.type = file
beaker.cache.long_term.expire = 86400

Примечание: Для тех, кто интересуется вопросом о memcached серверах, просто запишите их как url через запятую.

Если Вы хотите использовать кэширование вне Pylons без middleware (то есть, как обычную библиотеку), то теперь это сделать немного легче:

from beaker.cache import CacheManager
from beaker.util import parse_cache_config_options

cache_opts = {'cache.data_dir': './cache',
              'cache.type': 'file',
              'cache.regions': 'short_term', 'long_term',
              'cache.short_term.type': 'ext:memcached',
              'cache.short_term.url': '127.0.0.1:11211',
              'cache.short_term.expire': '3600',
              'cache.long_term.type': 'file',
              'cache.long_term.expire': '86400',
}

cache = CachManager(**parse_cache_config_options(cache_opts))

И ваш кеш-запрос теперь готов к использованию. Заметим, что использование этого кеш-объекта уже thread-safe, так что нужно просто сохранить его в вашем фреймворке/приложении (Может ли кто-нибудь, кто использует Django объяснить, где нужно сохранять ссылку на этот объект так, чтобы можно было добраться до него из пункта "Вид" в Django?).

Новые Кеш-Декораторы

Чтобы было легче использовать кэширование в вашем приложении, Beaker теперь имеет декораторы для кеш-объектов. С учетом вышеизложенного установка кэширования позволяет предположить, что Вы хотите кешировать вывод ценной операции:

# Get that cache object from wherever you put it, 
# maybe its in environ or request?
# In Pylons, this will be: from pylons import cache
from wherever import cache

def regular_function():
    # Do some boring stuff

    # Cache something
    @cache.region('short_term', 'mysearch')
    def expensive_search(phrase):
        # Do lookup with the phrase variable
        return something
    return expensive_search('frogs')

Второй аргумент в пользу применения декоратора, ‘mysearch’. Это не обязательно, если только у Вас нет двух функций с одинаковым именем в одном и том же модуле, так как Beaker записывает пространство имен кеша, используя имя функции + модуль + дополнительные аргументы. Для тех, кому интересно узнать, что такое пространство имен Beaker, то это отдельный 'блок' кеш. Допустим, что Вы хотите сохранить 4 версии одного и того же файла, но изменяйте их по-разному в зависимости от входящих параметров. Beaker считает, что дело в пространстве имен, и то что меняет кешируемый объект является кеш-ключами.

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

Если вы хотите использовать произвольные параметры кэш-памяти, то используйте другой декоратор:
# Get that cache object from wherever you put it, 
# maybe its in environ or request?
# In Pylons, this will be: from pylons import cache
from wherever import cache

def regular_function():
    # Do some boring stuff

    # Cache something
    @cache.cache('mysearch', type='file', expire=3600)
    def expensive_search(phrase):
        # Do lookup with the phrase variable
        return something
    return expensive_search('frogs')

Это позволяет переключать опции кеш в зависимости от Вашего желания.

Если есть что-нибудь еще, что я могу сделать для облегчения использования Beaker в вашем приложении, сообщите мне об этом. (Да, я знаю, что хотелось бы получить больше информации по данному вопросу, эта статья первая попытка помочь, дополнительная информация будет поступать по ходу работы!).

 

Оригинал статьи на groovie.org

Перевод ООО «Комтет» komtet.ru

Акция от КОМТЕТ и TemplateMonster
Клиентам — домены в подарок!
Бесплатный тест виртуального хостинга
Перенос сайта — бесплатно
Все акции
На сайте КОМТЕТ используются cookie-файлы, данные о IP-адресе и местоположении посетителей. Если, прочитав это сообщение, вы остаетесь на нашем сайте, это означает, что вы не возражаете против использования этих технологий.