在 gunicorn 上运行时,在 django 应用程序中缓存数据的更好方法是啥

Posted

技术标签:

【中文标题】在 gunicorn 上运行时,在 django 应用程序中缓存数据的更好方法是啥【英文标题】:What is a better approach to cache data in django app when running on gunicorn在 gunicorn 上运行时,在 django 应用程序中缓存数据的更好方法是什么 【发布时间】:2021-11-12 14:13:37 【问题描述】:

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

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

哪种方法(即在内存数据库中使用或其他方法)更好地解决此问题?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我使用 django-redis 包解决了这个问题,这个解决方案的主要优点是你不必更改代码,仍然使用 django.core.cache 中的cache.get()cache.set() 函数,你只需要添加特定于 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'
    


【讨论】:

以上是关于在 gunicorn 上运行时,在 django 应用程序中缓存数据的更好方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

django 和 gunicorn 在 docker 容器内运行时,无法在 ec2 上使用 nginx 提供静态文件

如何调试使用 whitenoise、gunicorn 和 heroku 服务的 django 静态文件?

Django 可以单独在 Gunicorn 上运行(没有 Apache 或 nginx)吗?

如何运行多个Django App Gunicorn systemd?

如何调试带有whitenoise,gunicorn和heroku的Django静态文件?

在 gunicorn 和 Tornado 上使用 Django 项目