Рубрики
Без рубрики

Введение в кэширование в Интернете, с примерами в Python

Что такое кеш? Кэш хранит данные, так что будущие запросы могут получить его быстрее. Генерация … Теги с WebDev, Python, начинающими, учебниками.

Что такое кеш?

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

Веб-приложения могут использовать кэш, работающий на одном веб-сервере, удаленном кеше или распределенной системе. Компании Cloud Service предлагают API для максимально масштабируемой распределенной кэширования. В простых однопоточных приложениях вы можете даже использовать объект в качестве кеша! Я видел это в крошечных службах Node.js.

Хорошо, дай мне пример

Возможно, вы слышали о MeMCached или Redis. Они оба обеспечивают хранение ключа/значения, а также хранения данных в других структурах данных. Вот пример высокого уровня использования кэша. Допустим, наше веб-приложение получает запрос на /Книги/312 Где 312 – это идентификатор книги. Мы хотим вернуть динамическую страницу с деталями об этой книге и, возможно, некоторые отзывы, которые люди ушли на книгу.

В псевдокоде, нанесение кеша к этой ситуации выглядит так:

do we have key '/books/312' in our cache?
if so:
    return that value as a response
else:
    generate a page
    store page in cache at '/books/321/'
    return page as a response

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

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

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

Вот пример высокого уровня этого:

call a hash function on 'books/321'
turn the hashed value into an index
check the corresponding cache server
get or set 'books/321/' from this server

Количество серверов кеша, которое знает веб-приложение, оказывается неограниченным. Он весы горизонтально – что означает, что больше серверов могут быть добавлены для решения более высоких нагрузок.

Вот некоторые проблемы, которые вы можете столкнуться с использованием системы кэширования:

  • Пользователи получают старые данные
  • Кэши заполняют слишком быстро
  • Запросы слишком уникальны для кэширования
  • Гоночные условия

Состояние гонки?

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

В идеале, это работает так:

get 'hit_count' from cache
increase by one
save new 'hit_count' to cache

Если наше веб-приложение является многопоточком или распределением, кэш можно поразить дважды одновременно. Оба экземпляра серверов увеличивают количество попаданий, которое они получают обратно из кэша. Оба экземпляра серверов, затем сохраняют это значение обратно. С точки зрения кэша, ключ запрашивается дважды, а затем сохраняется дважды. Оба экземпляра веб-приложения Запрос текущего значения попадания, 10 добавьте один так, чтобы у них обоих есть 11 И тогда они сохраняют это к кэше. Считается истинный удар 12 И некоторые данные были потеряны!

Эта проблема на самом деле решается MEMCACHED, который предлагает функции приращения и уменьшения. Для более сложных ситуаций, когда требуется атомная операция, Memcached имеет функцию сравнения и набора. Если вы используете повторяющуюся петлю, пытаясь выполнить операцию, не теряя никаких данных по пути.

Вот a Отличный блог Post Покрытие CAS более подробно.

Дайте мне примеры в коде

Давайте посмотрим на некоторые примеры этого в реальном коде. Мы будем использовать Flask и Django, самые популярные веб-каркасы Python. Оба поставляются с надежными решениями вне коробки.

Флэбка построена на Werkzeug, что означает, что мы можем использовать API из Werkzeug.contrib.cache без включения дополнительных модулей. Flask имеет страницу на шаблонах кэширования прямо здесь Отказ

Вот какой-то код из приложения Prototype я недавно написал с добавленными комментариями

# SimpleCache is a dev tool and is not threadsafe
# but it's very easy to swap in MemcachedCache or GAEMemcachedCache
from werkzeug.contrib.cache import SimpleCache

def create_app():
    app = Flask(__name__)
    # this line could be `cache = MemcachedCache(['127.0.0.1:11211'])`
    cache = SimpleCache()

    @app.route('/nearby//')
    def nearby_stores(postcode, radius):
        # have we performed this calculation for these arguments?
        if cache.get('{}{}'.format(postcode, radius)) is not None:
            return cache.get('{}{}'.format(postcode, radius))

        # otherwise do some calculations
        # ..

        # store for next time we run with these arguments
        cache.set('{}{}'.format(postcode, radius), jsonified)
        return jsonified

Cache Check в этом приложении может сохранить обработку, вызов базы данных и один третий запрос! Однако использование модуля кеша из Werkzeug добавляет некоторые ненужные строки, которые расширение, как Флэк-кеш избавляется от. Вместо того, чтобы вручную проверять кеш и установку кеша, мы можем использовать декоратор, который использует Запрос. Пути (который настраивается).

Таким образом, начало этой функции будет выглядеть так:

    @app.route('/nearby//')
    @cache.cached(timeout=120)
    def nearby_stores(postcode, radius):

Как колба, Джанго имеет Фантастическая страница При настройке кэширования для вашего приложения. Его каркас кэша очень похожа на случаи, которые мы только что видели. Самая большая разница будет начальная конфигурация. Django также может сохранить ваши кэшированные данные в базе данных, которую вы используете. Конфигурация более зрелая, чем колба, а также.

Вот пример из своих документов:

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):

Структурируя ваше приложение и выяснение, какие вычисления могут быть сохранены и использоваться в более позднее время – самая сложная часть! Кэширование веб-запросов для простых веб-приложений – довольно решенная проблема. Как вы владеете твой кэширующий меч для вас.

Я публикую уникальный контент на мой еженедельный рассылка 📧!

И твит о технике @healecodes Отказ

Оригинал: “https://dev.to/healeycodes/an-introduction-to-caching-on-the-web-with-examples-in-python-4ann”