Как кэшировать данные, полученные из BigQuery, в Django?

У меня есть webapp, который извлекает данные из BigQuery в мои представления Django, которые затем будут переданы в качестве контекста шаблонам frontend. Однако этот процесс извлечения данных происходит изначально, когда я открываю веб-приложение, и повторяется каждый раз, когда я обновляю страницу. Есть ли способ кэшировать данные, которые я извлек?

Мой views.py код выглядит примерно так:

def index(request):
    client = bigquery.Client()
    dataset_id = "project-id.dataset-id"
    tables = client.list_tables(dataset_id)
    tables_list = [table.table_id for table in tables]

    data_list = []
    for table_id in tables_list:
         query_string = f"""
              SELECT *
              FROM `project-id.dataset-id.{table_id}`
         """
    
         query_job = (
              client.query(query_string)
              .result()
         )

         records = [dict(row) for row in query_job]
         data_list.extend(records)

    df = pd.DataFrame(data_list)
    ...
    # Data manipulation syntax here using pandas dataframe
    ...
    data_json = df.to_json(orient="records")

    context = {'data_json': data_json}

    return render(request, 'template_name', context)

Я передал данные как JSON в контекст, потому что я передаю их фронтенду React.

В Django существует множество способов кэширования данных, здесь я покажу вам самый быстрый и эффективный согласно Django Doc : memcached

  1. Скачайте и установите memcached : Если вы на Linux, скачайте с сайта https://memcached.org/downloads. ./configure && make && sudo make install для установки. После установки Memcached откройте оболочку и запустите его с помощью следующей команды: memcached -l 127.0.0.1:11211

  2. Установка привязки к Python : После установки Memcached, вам необходимо установить его привязку к Python. Вы можете использовать pymemcache, pip install pymemcache.

    .
  3. Добавьте настройки memcached в ваш проект :

    .
    CACHES = {
      'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': '127.0.0.1:11211',
      }
    }
    
  4. Уровни кэширования : Django предоставляет следующие уровни кэширования, перечисленные здесь в порядке возрастания степени детализации:

  • API кэширования низкого уровня: Обеспечивает самую высокую степень детализации. Позволяет кэшировать определенные запросы или вычисления.
  • Кэш шаблонов: Позволяет кэшировать фрагменты шаблонов.
  • Per-view cache: Обеспечивает кэширование для отдельных представлений.
  • Пер-сайтовый кэш: Кэш самого высокого уровня. Он кэширует весь ваш сайт.
  1. Использование Low-Level cache API в вашем примере :

views.py

from django.core.cache import cache

def index(request):
    # First, try to retrieve the cached data if exist
    cached_data_json = cache.get('cached_data_json')
    
    # If the data has not been cached yet, generate and cache it
    if not cached_data_json:
        client = bigquery.Client()
        dataset_id = "project-id.dataset-id"
        tables = client.list_tables(dataset_id)
        tables_list = [table.table_id for table in tables]

        data_list = []
        for table_id in tables_list:
          query_string = f"""
            SELECT *
            FROM `project-id.dataset-id.{table_id}`
          """

          query_job = (
            client.query(query_string)
            .result()
          )

       records = [dict(row) for row in query_job]
       data_list.extend(records)

       df = pd.DataFrame(data_list)
       ...
       # Data manipulation syntax here using pandas dataframe
       ...
       data_json = df.to_json(orient="records")
       # Cache the data
       cache.set('cached_data_json', data_json)

    context = {'data_json': data_json}

    return render(request, 'template_name', context)

Вот как это работает: если cached_data_json присутствует в кэше, то используйте его, иначе, сделайте новое вычисление и сохраните его в кэше как cached_data_json.

OPTIONAL : Вы можете использовать django-memcache-status для мониторинга Memcached.

Вернуться на верх