在 gunicorn 上 运行 时,在 django 应用程序中缓存数据的更好方法是什么
What is a better approach to cache data in django app when running on gunicorn
我在 gunicorn 应用服务器上有一个 运行 的 django 应用程序。 Gunicorn 运行 N 个工作人员。我们知道每个 worker 都是一个单独的 python 进程。在我的一项应用程序服务中,我查询了一个需要很长时间(10-20 秒)的数据库。
好的,我决定缓存结果,所以只需添加 django.core.cache
并调用 cache.get(key)
如果结果不是 None 应用程序从缓存返回数据,如果不是它调用服务并存储使用 cache.set(key, data, time)
缓存中的数据。但是,如果我们有 N 个工作人员,并且第一个查询是针对工作人员 0 应用程序的长 运行 服务存储在工作人员 0 的缓存(进程内存)中的结果,但是当类似(请求包含分页选项,但我将整个 RawDataSet 存储在内存,所以每个页面 returns fast) 请求都按预期发送到 worker 1 缓存,因为这是一个不同的进程。所以很明显我必须使用一些可以被所有工作人员使用的缓存。
哪种方法(即在内存数据库中使用或其他方法)更适合解决此问题?
我会使用 REDIS(内存数据库)存储 SQL 结果并在 N 个工作人员之间共享。
我使用 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 应用程序。 Gunicorn 运行 N 个工作人员。我们知道每个 worker 都是一个单独的 python 进程。在我的一项应用程序服务中,我查询了一个需要很长时间(10-20 秒)的数据库。
好的,我决定缓存结果,所以只需添加 django.core.cache
并调用 cache.get(key)
如果结果不是 None 应用程序从缓存返回数据,如果不是它调用服务并存储使用 cache.set(key, data, time)
缓存中的数据。但是,如果我们有 N 个工作人员,并且第一个查询是针对工作人员 0 应用程序的长 运行 服务存储在工作人员 0 的缓存(进程内存)中的结果,但是当类似(请求包含分页选项,但我将整个 RawDataSet 存储在内存,所以每个页面 returns fast) 请求都按预期发送到 worker 1 缓存,因为这是一个不同的进程。所以很明显我必须使用一些可以被所有工作人员使用的缓存。
哪种方法(即在内存数据库中使用或其他方法)更适合解决此问题?
我会使用 REDIS(内存数据库)存储 SQL 结果并在 N 个工作人员之间共享。
我使用 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'
}
}