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