Python代理将数据存储在内存中

时间:2019-03-12 13:35:49

标签: python-3.x rest caching flask proxy

我已经开始使用带有flask_restplus的python3进行一个小项目,我需要投入生产,所以我面临着重新编写代码的需要,并且我需要一些建议以使其更加健壮,这是我的问题的描述:

说明

此代理会定期从其他服务请求一些数据,并通过REST API公开数据,以便UI可以使用它。由于UI需要实时显示数据,例如下拉列表,动态字段更新,因此代理保存的某些数据会缓存在内存中,以便为用户提供实时体验,而无需等待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()

我知道这是一个糟糕的主意,但是为了草拟版本并验证需求可以正常工作,但是现在我需要发展。

最终问题

什么是替换此awfull全局变量的有效选项?

我的祝福

我考虑一下,为了速度而在内存中安装一个sqlite3,并将所有这些数据存储在那里,因为在大多数情况下,我需要在处理此问题时使用for循环和IF语句执行一些“ SQL联接查询”数据发送到UI之前。 例如

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

PS:我不需要矫kill过正/企业解决方案,因为用户数量不会超过1k倍。

1 个答案:

答案 0 :(得分:1)

TLDR::查看examplememcached。它们都易于部署和配置,具有python客户端。

请记住,您可能通过某些wsgi服务器运行应用程序并跨越多个进程。在您的解决方案中,每个进程都将拥有自己的缓存副本。这是不希望的,因为如果需要请求之间的一致性,则需要提供一些缓存刷新同步。

我将为缓存创建简单的键值存储。多亏了您的python应用将是无状态的,并准备在启动后立即回答请求。如果您在gevent中使用gunicorn工作者类,则非常有用。