Python прокси для хранения данных в памяти - PullRequest
0 голосов
/ 12 марта 2019

Я запустил небольшой проект с использованием python3 с flask_restplus, и мне нужно приступить к работе, поэтому я столкнулся с необходимостью переделки кода, и мне нужны некоторые предложения, чтобы сделать его более надежным, вот описание моего вопроса:

Описание

Этот прокси-сервер периодически запрашивает некоторые данные из другой службы и предоставляет данные через API REST, чтобы пользовательский интерфейс мог их использовать.Поскольку пользовательскому интерфейсу необходимо отображать данные в режиме реального времени, например, выпадающие списки, обновлять динамические поля, некоторые данные, содержащиеся в прокси-сервере, кэшируются в памяти, чтобы дать пользователю возможность работать в режиме реального времени, а не ждать 3 секунды, пока выпадающий список не отобразит XD.

Итак, для построения кеша я в основном храню некоторые данные в типе словаря глобальной переменной, поскольку все ответы, поступающие от другого сервиса, являются JSON, и это позволяет мне быстро получать / использовать некоторые данныепри необходимости.

dataCache = {} #this is where I store the cache items

  def refresh_cache():  #function to refresh cache periodically

       start = time.time()

       #Get all service desks
       get_all_project()

       #Get all organizations
       get_all_organizations_by_project()

       #Get all customers by Desks
       get_all_customers_by_project()

       print("Refresh Cache Took "+str(time.time()-start)+"")

       threading.Timer(app.config['CACHE_REFRESH'], refresh_cache).start()

Я знаю, что это ужасная идея, но ради черновой версии и проверки требований сработало отлично, но теперь мне нужно расти.

Последний вопрос

Какие могут быть допустимые варианты для замены этой ужасной глобальной переменной?

Мои мысли

Я думаю о том, чтобы ради скорости смонтировать sqlite3 в память и сохранить там все эти данные, так как большую часть времени мне нужносделать несколько запросов на присоединение к ¨SQL, например, «использование для циклов и операторов IF при обработке этих данных перед отправкой в ​​пользовательский интерфейс. Например:

        for rType in dataCache[companyName]['types']:
           if dataCache[companyName]['projectId']==id:
             bla bla bla bla

PS: Мне не нужны решения для избыточного использования / корпоративные решениятак как количество пользователей не превысит 1k раз.

1 Ответ

1 голос
/ 12 марта 2019

TLDR: Посмотрите на memcached или redis .Они оба просты в развертывании и настройке, имеют клиенты Python.

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

Я бы создал простое хранилище значений ключа для кэша.Благодаря этому ваше приложение на Python останется без состояния и будет готово отвечать на запросы сразу после запуска.Очень полезно, если вы используете gevent рабочий класс в gunicorn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...