代码之家  ›  专栏  ›  技术社区  ›  Michael Ushakov

在gunicorn上运行django应用程序时,有什么更好的方法可以缓存数据

  •  0
  • Michael Ushakov  · 技术社区  · 4 年前

    我有一个django应用程序正在gunicorn应用服务器上运行。Gunicorn经营着一家工厂。我们知道每个工人都是一个独立的python进程。在我的一个应用程序服务中,我对一个数据库的查询需要很长时间(10-20秒)。

    好吧,我决定缓存结果,所以只需添加 django.core.cache 打电话 cache.get(key) 若结果不是None,则应用程序从缓存返回数据,若不是,则调用服务并使用将数据存储在缓存中 cache.set(key, data, time) 但是,如果我们有N个workers,并且第一个查询被发送到worker 0,应用程序会将长期运行服务的结果存储在worker 0的缓存(进程内存)中,但是当类似的情况下(请求包含分页选项,但我会将整个RawDataSet存储在内存中,所以每个页面都会快速返回),请求按预期发送到worker 1缓存将无法工作,因为这是一个不同的进程。所以很明显,我必须使用一些可以被所有工人使用的缓存。

    什么方法(即使用内存数据库或其他方法)更好地解决这个问题?

    1 回复  |  直到 4 年前
        1
  •  0
  •   Pablo Santa Cruz    4 年前

    我将使用REDIS(内存数据库)存储SQL结果,并在N个工作人员之间共享它们。

        2
  •  0
  •   Michael Ushakov    4 年前

    我使用django redis包解决了这个问题,这个解决方案的主要优点是您不需要更改代码,仍然可以使用 cache.get() cache.set() 来自django的函数。果心缓存您只需将特定于redis的缓存设置添加到设置文件中,如下所示:

    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache',
            'LOCATION': 'redis://127.0.0.1:6379/12',
            'OPTIONS': {
                'CLIENT_CLASS': 'django_redis.client.DefaultClient'
            },
            'KEY_PREFIX': 'text_analyzer'
        }
    }