【问题标题】:Django & Redis: How do I properly use connection pooling?Django & Redis:如何正确使用连接池?
【发布时间】:2015-02-09 07:18:16
【问题描述】:

我有一个 Redis 服务器,我在几乎每个 Django 视图上查询它以获取一些缓存数据。我已经阅读了一些 stackoverflow 问题,并了解到通过 r = redis.StrictRedis(host='localhost', port=6379, db=0) 为每个 Web 请求建立新的 Redis 连接是不好的,我应该使用连接池。

这是我为 Django 中的连接池提出的方法:

在settings.py 中,我可以在任何 Django 视图中轻松将其拉起,因为这就像一个全局变量:

# Redis Settings
import redis
REDIS_CONN_POOL_1 = redis.ConnectionPool(host='localhost', port=6379, db=0)

在一些views.py:

from django.conf import settings  
REDIS_CONN_POOL_1 = settings.REDIS_POOL_1   
r = redis.Redis(connection_pool=REDIS_CONN_POOL_1)
r.get("foobar") # Whatever operation  

所以,我的问题是:这是在 Django 中进行连接池的正确方法吗?对于那些经历过类似情况的人,你们有没有更好的方法?这可能比我在每次请求时打开和关闭与 redis 的新连接的旧方法更好。

编辑:收集了我对为什么在来自 stackoverflow question 的每个请求上打开新连接是错误的理解。

【问题讨论】:

    标签: python django redis


    【解决方案1】:

    更好的方法是使用 Django redis cache 应用程序将 redis 设置为 Django 的缓存后端。它为您的问题提供了一个完整的解决方案,您可以在需要获取或设置缓存信息时使用 Django 的官方缓存库来访问 redis。如果您决定将缓存后端更改为其他内容,还可以避免应用程序中的兼容性问题。

    这里有一个简单易懂的教程:

    Using Redis as Django's session store and cache backend

    【讨论】:

    • 这对于一个数据库来说似乎是一个很好的解决方案。知道如何在通过from django.core.cache import cache 执行操作时指定多个 DB 或在 DB 之间切换吗?根据我在阅读 Django redis 缓存文档时收集到的信息,我们只能指定一个数据库。
    • 好吧,redis 中的 DB 数量限制为 12。使用键前缀要容易得多。您甚至可以编写自己的辅助方法来访问它们,而不会造成很多麻烦。顺便说一下,为什么需要多个 DB?
    • 我需要多个数据库,因为我根据数据类型将数据组织到多个数据库中。
    • 可以在Django的CACHES中设置多个缓存,使用不同的DB号,见django-redis-cache.readthedocs.io/en/latest/…
    • 缓存后端的问题是使用了pickle。这意味着您无法共享缓存、升级问题并增加攻击面。
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2010-12-27
    • 2021-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多